diff --git a/.gitignore b/.gitignore index aa724b7..3991950 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ .externalNativeBuild .cxx local.properties +/app/src/main/assets/keyboard.json diff --git a/app/build.gradle b/app/build.gradle index 60b3efb..767c610 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -30,6 +30,11 @@ android { kotlinOptions { jvmTarget = '1.8' } + + buildFeatures { + viewBinding = true + } + } dependencies { @@ -42,4 +47,7 @@ dependencies { testImplementation libs.junit androidTestImplementation libs.androidx.junit androidTestImplementation libs.androidx.espresso.core + + + implementation 'com.google.code.gson:gson:2.10.1' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6afad9e..4a34804 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,7 @@ + + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - enableEdgeToEdge() - setContentView(R.layout.activity_main) - ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> - val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) - v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) - insets + binding = ActivityMainBinding.inflate(layoutInflater) + val view = binding.root + setContentView(view) + + // 获取ConnectivityManager实例 + val connectivityManager = getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager + // 检查网络连接状态 + val networkInfo = connectivityManager.activeNetworkInfo + if (networkInfo != null && networkInfo.isConnected) { + // 已连接到互联网 + Log.d("NetworkStatus", "Connected to the Internet") + } else { + // 未连接到互联网 + Log.d("NetworkStatus", "Not connected to the Internet") } + + // 设置Padding上边距留出沉浸式状态栏空间 + binding.root.setPadding(0, dpCovertPx(this), 0, 0) + // 设置沉浸式状态栏 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + window.decorView.systemUiVisibility = + (View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE) or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR + window.statusBarColor = Color.TRANSPARENT + } + + initDrawer() + + val rootModelList: MutableList = mutableListOf() + val result = parseJsonFromAssets(this@MainActivity, "keyboard.json") + if (result != null) { + rootModelList.addAll(result) + } + + rootModelList.shuffle() + + for (i in rootModelList) { + binding.tabLayout.addTab( + binding.tabLayout.newTab().setCustomView(R.layout.item_tab) + ) + } + + fragmentList = arrayListOf() + + for (i in 0 until binding.tabLayout.tabCount) { + val tabView = binding.tabLayout.getTabAt(i)?.customView + if (tabView != null) { + val rootModel = rootModelList[i] + val textName = tabView.findViewById(R.id.keyboard_kind_name) + textName.text = rootModel.className + fragmentList.add(VPFragment(rootModel)) + } + } + + binding.tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(p0: TabLayout.Tab?) { + setTabSize(p0) + } + + override fun onTabUnselected(p0: TabLayout.Tab?) { + p0?.customView = null + } + + override fun onTabReselected(p0: TabLayout.Tab?) { + // null + } + }) + + + binding.viewpager.offscreenPageLimit = 3 + binding.viewpager.adapter = object : FragmentPagerAdapter(supportFragmentManager) { + override fun getCount(): Int { + return fragmentList.size + } + + override fun getItem(position: Int): Fragment { + return fragmentList[position] + } + + override fun getPageTitle(position: Int): CharSequence? { + return rootModelList[position].className + } + } + binding.tabLayout.setupWithViewPager(binding.viewpager) + + + } + + + private fun setTabSize(p0: TabLayout.Tab?) { + val textView = TextView(this) + //字体样式 + val selectedSize = + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 22f, resources.displayMetrics) + textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, selectedSize) + textView.typeface = Typeface.defaultFromStyle(Typeface.BOLD) //加粗 + textView.gravity = Gravity.CENTER + //选中的字体颜色 + textView.setTextColor(ContextCompat.getColor(this, R.color.theme_color)) + textView.text = p0!!.text + p0.customView = textView + } + + private fun initDrawer() { + binding.layoutRate.setOnClickListener() { + val url = getString(R.string.share_link) + packageName + // 创建intent打开链接 + val intent = Intent(Intent.ACTION_VIEW) + intent.setData(Uri.parse(url)) + startActivity(intent) + } + // 绑定抽屉中的分享按钮 + binding.layoutShare.setOnClickListener() { + // 商店中包的位置 + val url = getString(R.string.share_link) + packageName + val intent = Intent(Intent.ACTION_SEND) + intent.setType("text/plain") + intent.putExtra(Intent.EXTRA_TEXT, url) + startActivity(intent) + } + // 绑定抽屉中的版本信息 + val versionName = getVersionName() + binding.textAppVersion.text = versionName + + // 打开抽屉 + binding.imageMenu.setOnClickListener() { + binding.drawerParent.openDrawer(GravityCompat.START) + } + + binding.drawerParent.addDrawerListener(object : DrawerLayout.DrawerListener { + override fun onDrawerSlide(drawerView: View, slideOffset: Float) { + } + + override fun onDrawerOpened(drawerView: View) { + // 设置监听事件防止 Drawer 穿透 + drawerView.isClickable = true + } + + override fun onDrawerClosed(drawerView: View) { + } + + override fun onDrawerStateChanged(newState: Int) { + } + }) + } + + private fun getVersionName(): String { + val pInfo: PackageInfo + try { + pInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + packageManager.getPackageInfo(packageName, PackageManager.PackageInfoFlags.of(0)) + } else { + packageManager.getPackageInfo(packageName, 0) + } + } catch (e: PackageManager.NameNotFoundException) { + return "" + } + return "Version: " + pInfo.versionName } } \ No newline at end of file diff --git a/app/src/main/java/com/timber/soft/newkeyboard/fragment/VPFragment.kt b/app/src/main/java/com/timber/soft/newkeyboard/fragment/VPFragment.kt new file mode 100644 index 0000000..ee90faa --- /dev/null +++ b/app/src/main/java/com/timber/soft/newkeyboard/fragment/VPFragment.kt @@ -0,0 +1,9 @@ +package com.timber.soft.newkeyboard.fragment + +import androidx.fragment.app.Fragment +import com.timber.soft.newkeyboard.model.RootModel + +class VPFragment(private val rootModel: RootModel) : Fragment() { + + +} \ No newline at end of file diff --git a/app/src/main/java/com/timber/soft/newkeyboard/model/JsonDeserializer.kt b/app/src/main/java/com/timber/soft/newkeyboard/model/JsonDeserializer.kt new file mode 100644 index 0000000..261b8a2 --- /dev/null +++ b/app/src/main/java/com/timber/soft/newkeyboard/model/JsonDeserializer.kt @@ -0,0 +1,44 @@ +package com.timber.soft.newkeyboard.model + +import android.content.Context +import com.google.gson.Gson +import java.io.BufferedReader +import java.io.IOException +import java.io.InputStreamReader +import java.io.Serializable +import java.nio.charset.StandardCharsets + +object JsonDeserializer { + + fun parseJsonFromAssets(context: Context, fileName: String): List? { + var dataItems: List? = null + try { + val inputStream = context.assets.open(fileName) + val reader = BufferedReader(InputStreamReader(inputStream, StandardCharsets.UTF_8)) + val stringBuilder = StringBuilder() + var line: String? + while (reader.readLine().also { line = it } != null) { + stringBuilder.append(line) + } + inputStream.close() + reader.close() + val gson = Gson() + val dataItemArray = + gson.fromJson(stringBuilder.toString(), Array::class.java) + dataItems = dataItemArray.toList() + } catch (e: IOException) { + e.printStackTrace() + } + return dataItems + } + +} + + +data class RootModel( + val className: String, val list: List +) : Serializable + +data class DataModel( + val preview: String, val thumb: String, val title: String, val zipUrl: String +) : Serializable \ No newline at end of file diff --git a/app/src/main/java/com/timber/soft/newkeyboard/tools/StatusBarTools.kt b/app/src/main/java/com/timber/soft/newkeyboard/tools/StatusBarTools.kt new file mode 100644 index 0000000..06333bc --- /dev/null +++ b/app/src/main/java/com/timber/soft/newkeyboard/tools/StatusBarTools.kt @@ -0,0 +1,15 @@ +package com.timber.soft.newkeyboard.tools + +import android.content.Context + +object StatusBarTools { + fun dpCovertPx(context: Context): Int { + // 获取当前设备的屏幕密度,并赋值给变量 scale + var result = 0 + val resourceId = context.resources.getIdentifier("status_bar_height", "dimen", "android") + if (resourceId > 0) { + result = context.resources.getDimensionPixelSize(resourceId) + } + return result + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/svg_google_play.xml b/app/src/main/res/drawable/svg_google_play.xml new file mode 100644 index 0000000..8b4f45e --- /dev/null +++ b/app/src/main/res/drawable/svg_google_play.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/svg_menu.xml b/app/src/main/res/drawable/svg_menu.xml new file mode 100644 index 0000000..c1e495b --- /dev/null +++ b/app/src/main/res/drawable/svg_menu.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/svg_return.xml b/app/src/main/res/drawable/svg_return.xml new file mode 100644 index 0000000..ff51733 --- /dev/null +++ b/app/src/main/res/drawable/svg_return.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/svg_share.xml b/app/src/main/res/drawable/svg_share.xml new file mode 100644 index 0000000..41faa06 --- /dev/null +++ b/app/src/main/res/drawable/svg_share.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 5dfe6e2..ae85a41 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,19 +1,186 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - \ No newline at end of file diff --git a/app/src/main/res/layout/item_tab.xml b/app/src/main/res/layout/item_tab.xml new file mode 100644 index 0000000..0406462 --- /dev/null +++ b/app/src/main/res/layout/item_tab.xml @@ -0,0 +1,25 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index c8524cd..18a5c05 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -2,4 +2,9 @@ #FF000000 #FFFFFFFF + + + #FF9800 + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7c87cb3..18e16c9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,6 @@ NewKeyboard + Share our Apps + Find us in store + https://play.google.com/store/apps/details?id= \ No newline at end of file