6.6.2 - Alpha - 更新 ApkSig 源代码; APK 文件类型增加文件大小与签名方案信息
This commit is contained in:
@@ -763,7 +763,7 @@ open class ExplorerView : ThemeColorSwipeRefreshLayout, SwipeRefreshLayout.OnRef
|
||||
private fun showInfo() {
|
||||
when {
|
||||
mExplorerItem.isInstallable -> {
|
||||
ApkInfoDialogManager.showApkInfoDialog(context, mExplorerItem)
|
||||
ApkInfoDialogManager.showApkInfoDialog(context, mExplorerItem.toScriptFile())
|
||||
notifyItemOperated()
|
||||
}
|
||||
mExplorerItem.isMediaMenu || mExplorerItem.isMediaPlayable -> {
|
||||
|
||||
@@ -18,8 +18,9 @@ import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import org.autojs.autojs.model.explorer.ExplorerItem
|
||||
import org.autojs.autojs.pio.PFiles
|
||||
import org.autojs.autojs.runtime.api.AppUtils
|
||||
import org.autojs.autojs.util.IntentUtils
|
||||
import org.autojs.autojs6.R
|
||||
import org.autojs.autojs6.databinding.ApkFileInfoDialogListItemBinding
|
||||
import java.io.File
|
||||
@@ -28,28 +29,30 @@ object ApkInfoDialogManager {
|
||||
|
||||
@JvmStatic
|
||||
@SuppressLint("SetTextI18n")
|
||||
fun showApkInfoDialog(context: Context, explorerItem: ExplorerItem) {
|
||||
fun showApkInfoDialog(context: Context, apkFile: File) {
|
||||
val binding = ApkFileInfoDialogListItemBinding.inflate(LayoutInflater.from(context))
|
||||
val root = binding.root as ViewGroup
|
||||
|
||||
val apkFilePath = apkFile.absolutePath
|
||||
|
||||
val dialog = MaterialDialog.Builder(context)
|
||||
.title(explorerItem.name)
|
||||
.title(apkFile.name)
|
||||
.customView(root, false)
|
||||
.autoDismiss(false)
|
||||
.iconRes(R.drawable.transparent)
|
||||
.limitIconToDefaultSize()
|
||||
.positiveText(R.string.text_install)
|
||||
.positiveColorRes(R.color.dialog_button_attraction)
|
||||
.onPositive { materialDialog, _ ->
|
||||
materialDialog.dismiss()
|
||||
explorerItem.install(context)
|
||||
IntentUtils.installApk(context, apkFilePath)
|
||||
}
|
||||
.positiveColorRes(R.color.dialog_button_attraction)
|
||||
.negativeText(R.string.text_cancel)
|
||||
.onNegative { materialDialog, _ -> materialDialog.dismiss() }
|
||||
.negativeColorRes(R.color.dialog_button_default)
|
||||
.neutralColorRes(R.color.dialog_button_hint)
|
||||
.onNegative { materialDialog, _ -> materialDialog.dismiss() }
|
||||
.show()
|
||||
|
||||
val apkFilePath = explorerItem.toScriptFile().absolutePath
|
||||
val packageManager = context.packageManager
|
||||
|
||||
CoroutineScope(Dispatchers.Main).launch {
|
||||
@@ -67,6 +70,10 @@ object ApkInfoDialogManager {
|
||||
}
|
||||
}
|
||||
|
||||
val fileSize = withContext(Dispatchers.IO) { PFiles.getHumanReadableSize(apkFile.length()) }
|
||||
|
||||
val signatureScheme = withContext(Dispatchers.IO) { getApkSignatureInfo(apkFile) }
|
||||
|
||||
withContext(Dispatchers.Main) {
|
||||
// @Hint by SuperMonster003 on Nov 27, 2024.
|
||||
// ! Prioritize handling "installed version" to determine whether to display its content view.
|
||||
@@ -85,12 +92,15 @@ object ApkInfoDialogManager {
|
||||
binding.deviceSdkValue.text = "${Build.VERSION.SDK_INT}"
|
||||
bindVersionInfo(binding, context, versionName, versionCode)
|
||||
|
||||
binding.fileSizeValue.setTextIfAbsent { fileSize }
|
||||
binding.signatureSchemeValue.setTextIfAbsent { signatureScheme }
|
||||
|
||||
dialog.setIcon(applicationInfo?.apply {
|
||||
sourceDir = apkFilePath
|
||||
publicSourceDir = apkFilePath
|
||||
}?.loadIcon(packageManager) ?: context.getDrawable(R.drawable.ic_packaging))
|
||||
|
||||
val apkInfo = getApkInfo(explorerItem.toScriptFile())
|
||||
val apkInfo = getApkInfo(apkFile)
|
||||
|
||||
binding.labelNameValue.setTextIfAbsent { apkInfo?.label }
|
||||
binding.packageNameValue.setTextIfAbsent { apkInfo?.packageName }
|
||||
@@ -153,24 +163,22 @@ object ApkInfoDialogManager {
|
||||
}
|
||||
|
||||
private fun restoreEssentialViews(binding: ApkFileInfoDialogListItemBinding, context: Context) {
|
||||
binding.labelNameLabel.text = context.getString(R.string.text_label_name)
|
||||
binding.labelNameColon.isVisible = true
|
||||
binding.labelNameValue.isVisible = true
|
||||
binding.packageNameLabel.text = context.getString(R.string.apk_info_package_name)
|
||||
binding.packageNameColon.isVisible = true
|
||||
binding.packageNameValue.isVisible = true
|
||||
binding.versionPlaceholderLabel.text = context.getString(R.string.text_version)
|
||||
binding.versionPlaceholderColon.isVisible = true
|
||||
binding.versionPlaceholderValue.isVisible = true
|
||||
binding.minSdkLabel.text = context.getString(R.string.apk_info_min_sdk)
|
||||
binding.minSdkColon.isVisible = true
|
||||
binding.minSdkValue.isVisible = true
|
||||
binding.targetSdkLabel.text = context.getString(R.string.apk_info_target_sdk)
|
||||
binding.targetSdkColon.isVisible = true
|
||||
binding.targetSdkValue.isVisible = true
|
||||
binding.deviceSdkLabel.text = context.getString(R.string.apk_info_device_sdk)
|
||||
binding.deviceSdkColon.isVisible = true
|
||||
binding.deviceSdkValue.isVisible = true
|
||||
listOf(
|
||||
Triple(binding.labelNameLabel, binding.labelNameColon, binding.labelNameValue) to R.string.text_label_name,
|
||||
Triple(binding.packageNameLabel, binding.packageNameColon, binding.packageNameValue) to R.string.apk_info_package_name,
|
||||
Triple(binding.versionPlaceholderLabel, binding.versionPlaceholderColon, binding.versionPlaceholderValue) to R.string.text_version,
|
||||
Triple(binding.fileSizeLabel, binding.fileSizeColon, binding.fileSizeValue) to R.string.apk_info_file_size,
|
||||
Triple(binding.signatureSchemeLabel, binding.signatureSchemeColon, binding.signatureSchemeValue) to R.string.apk_info_signature_scheme,
|
||||
Triple(binding.minSdkLabel, binding.minSdkColon, binding.minSdkValue) to R.string.apk_info_min_sdk,
|
||||
Triple(binding.targetSdkLabel, binding.targetSdkColon, binding.targetSdkValue) to R.string.apk_info_target_sdk,
|
||||
Triple(binding.deviceSdkLabel, binding.deviceSdkColon, binding.deviceSdkValue) to R.string.apk_info_device_sdk,
|
||||
).forEach { pair ->
|
||||
val (triple, labelTextRes) = pair
|
||||
val (labelView, colonView, valueView) = triple
|
||||
labelView.text = context.getString(labelTextRes)
|
||||
colonView.isVisible = true
|
||||
valueView.isVisible = true
|
||||
}
|
||||
}
|
||||
|
||||
private fun updateGuidelines(binding: ApkFileInfoDialogListItemBinding) {
|
||||
@@ -178,6 +186,8 @@ object ApkInfoDialogManager {
|
||||
binding.labelNameLabel to binding.labelNameGuideline,
|
||||
binding.packageNameLabel to binding.packageNameGuideline,
|
||||
binding.versionPlaceholderLabel to binding.versionPlaceholderGuideline,
|
||||
binding.fileSizeLabel to binding.fileSizeGuideline,
|
||||
binding.signatureSchemeLabel to binding.signatureSchemeGuideline,
|
||||
binding.minSdkLabel to binding.minSdkGuideline,
|
||||
binding.targetSdkLabel to binding.targetSdkGuideline,
|
||||
binding.installedVersionLabel to binding.installedVersionGuideline,
|
||||
@@ -194,8 +204,8 @@ object ApkInfoDialogManager {
|
||||
}
|
||||
}
|
||||
|
||||
private fun getApkSignatureInfo(apkFilePath: String): String? = runCatching {
|
||||
ApkVerifier.Builder(File(apkFilePath)).build().verify().run {
|
||||
private fun getApkSignatureInfo(apkFile: File): String? = runCatching {
|
||||
ApkVerifier.Builder(apkFile).build().verify().run {
|
||||
listOfNotNull(
|
||||
"V1".takeIf { isVerifiedUsingV1Scheme },
|
||||
"V2".takeIf { isVerifiedUsingV2Scheme },
|
||||
|
||||
@@ -54,7 +54,7 @@ open class ExplorerFragment : ViewPagerFragment(0), OnFloatingActionButtonClickL
|
||||
override fun onItemClick(view: View?, item: ExplorerItem) {
|
||||
when {
|
||||
item.isTextEditable -> Scripts.edit(requireActivity(), item.toScriptFile())
|
||||
item.isInstallable -> ApkInfoDialogManager.showApkInfoDialog(requireActivity(), item)
|
||||
item.isInstallable -> ApkInfoDialogManager.showApkInfoDialog(requireActivity(), item.toScriptFile())
|
||||
item.isMediaMenu || item.isMediaPlayable -> MediaInfoDialogManager.showMediaInfoDialog(requireActivity(), item)
|
||||
else -> viewFile(item)
|
||||
}
|
||||
|
||||
@@ -42,6 +42,7 @@ import org.autojs.autojs.ui.BaseActivity;
|
||||
import org.autojs.autojs.ui.common.NotAskAgainDialog;
|
||||
import org.autojs.autojs.ui.filechooser.FileChooserDialogBuilder;
|
||||
import org.autojs.autojs.ui.keystore.ManageKeyStoreActivity;
|
||||
import org.autojs.autojs.ui.main.scripts.ApkInfoDialogManager;
|
||||
import org.autojs.autojs.ui.shortcut.AppsIconSelectActivity;
|
||||
import org.autojs.autojs.ui.viewmodel.KeyStoreViewModel;
|
||||
import org.autojs.autojs.ui.widget.RoundCheckboxWithText;
|
||||
@@ -880,8 +881,13 @@ public class BuildActivity extends BaseActivity implements ApkBuilder.ProgressCa
|
||||
.title(R.string.text_build_succeeded)
|
||||
.content(getString(R.string.format_build_succeeded, outApk.getPath()))
|
||||
.positiveText(R.string.text_install)
|
||||
.negativeText(R.string.text_cancel)
|
||||
.positiveColorRes(R.color.dialog_button_attraction)
|
||||
.onPositive((dialog, which) -> IntentUtils.installApk(BuildActivity.this, outApk.getPath()))
|
||||
.negativeText(R.string.text_cancel)
|
||||
.negativeColorRes(R.color.dialog_button_default)
|
||||
.neutralText(R.string.dialog_button_file_information)
|
||||
.neutralColorRes(R.color.dialog_button_hint)
|
||||
.onNeutral((dialog, which) -> ApkInfoDialogManager.showApkInfoDialog(dialog.getContext(), outApk))
|
||||
.show();
|
||||
}
|
||||
|
||||
|
||||
@@ -237,7 +237,7 @@
|
||||
android:layout_marginTop="4sp"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/version_placeholder_parent"
|
||||
app:layout_constraintBottom_toTopOf="@id/min_sdk_parent"
|
||||
app:layout_constraintBottom_toTopOf="@id/file_size_parent"
|
||||
app:layout_constraintEnd_toEndOf="parent">
|
||||
|
||||
<androidx.constraintlayout.widget.Guideline
|
||||
@@ -295,6 +295,151 @@
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/file_size_parent"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="@dimen/ref_md_dialog_frame_margin"
|
||||
android:layout_marginStart="@dimen/ref_md_listitem_margin_left"
|
||||
android:layout_marginTop="4sp"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/installed_version_parent"
|
||||
app:layout_constraintBottom_toTopOf="@id/signature_scheme_parent"
|
||||
app:layout_constraintEnd_toEndOf="parent">
|
||||
|
||||
<androidx.constraintlayout.widget.Guideline
|
||||
android:id="@+id/file_size_guideline"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
app:layout_constraintGuide_begin="100dp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/file_size_label"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical|start"
|
||||
android:textAlignment="viewStart"
|
||||
android:text="@string/ellipsis_six"
|
||||
tools:text="@string/apk_info_file_size"
|
||||
android:lineSpacingExtra="2dp"
|
||||
android:textSize="@dimen/ref_md_listitem_textsize"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@id/file_size_guideline" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/file_size_colon"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical|start"
|
||||
android:textAlignment="viewStart"
|
||||
android:layout_marginHorizontal="4sp"
|
||||
android:text="@string/symbol_colon"
|
||||
android:textSize="@dimen/ref_md_listitem_textsize"
|
||||
app:layout_constraintStart_toEndOf="@id/file_size_label"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@id/file_size_value" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/file_size_value"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible"
|
||||
android:text="@string/ellipsis_six"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical|start"
|
||||
android:textAlignment="viewStart"
|
||||
android:maxLines="2"
|
||||
android:ellipsize="end"
|
||||
android:paddingBottom="0dp"
|
||||
android:paddingTop="0dp"
|
||||
android:lineSpacingExtra="2dp"
|
||||
android:textSize="@dimen/ref_md_listitem_textsize"
|
||||
app:layout_constraintStart_toEndOf="@id/file_size_colon"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/signature_scheme_parent"
|
||||
android:visibility="visible"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="@dimen/ref_md_dialog_frame_margin"
|
||||
android:layout_marginStart="@dimen/ref_md_listitem_margin_left"
|
||||
android:layout_marginTop="4sp"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/file_size_parent"
|
||||
app:layout_constraintBottom_toTopOf="@id/min_sdk_parent"
|
||||
app:layout_constraintEnd_toEndOf="parent">
|
||||
|
||||
<androidx.constraintlayout.widget.Guideline
|
||||
android:id="@+id/signature_scheme_guideline"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
app:layout_constraintGuide_begin="100dp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/signature_scheme_label"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical|start"
|
||||
android:textAlignment="viewStart"
|
||||
android:text="@string/ellipsis_six"
|
||||
tools:text="@string/apk_info_signature_scheme"
|
||||
android:lineSpacingExtra="2dp"
|
||||
android:textSize="@dimen/ref_md_listitem_textsize"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@id/signature_scheme_guideline" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/signature_scheme_colon"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical|start"
|
||||
android:textAlignment="viewStart"
|
||||
android:layout_marginHorizontal="4sp"
|
||||
android:text="@string/symbol_colon"
|
||||
android:textSize="@dimen/ref_md_listitem_textsize"
|
||||
app:layout_constraintStart_toEndOf="@id/signature_scheme_label"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@id/signature_scheme_value" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/signature_scheme_value"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible"
|
||||
android:text="@string/ellipsis_six"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical|start"
|
||||
android:textAlignment="viewStart"
|
||||
android:maxLines="2"
|
||||
android:ellipsize="end"
|
||||
android:paddingBottom="0dp"
|
||||
android:paddingTop="0dp"
|
||||
android:lineSpacingExtra="2dp"
|
||||
android:textSize="@dimen/ref_md_listitem_textsize"
|
||||
app:layout_constraintStart_toEndOf="@id/signature_scheme_colon"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/min_sdk_parent"
|
||||
android:visibility="visible"
|
||||
@@ -304,7 +449,7 @@
|
||||
android:layout_marginStart="@dimen/ref_md_listitem_margin_left"
|
||||
android:layout_marginTop="4sp"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/installed_version_parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/signature_scheme_parent"
|
||||
app:layout_constraintBottom_toTopOf="@id/target_sdk_parent"
|
||||
app:layout_constraintEnd_toEndOf="parent">
|
||||
|
||||
|
||||
@@ -890,5 +890,8 @@
|
||||
<string name="text_package_name_with_computing" tools:ignore="TypographyEllipsis">包名 (计算中...)</string>
|
||||
<string name="text_version_name_with_computing" tools:ignore="TypographyEllipsis">版本名称 (计算中...)</string>
|
||||
<string name="text_version_code_with_computing" tools:ignore="TypographyEllipsis">版本号 (计算中...)</string>
|
||||
<string name="apk_info_file_size">文件大小</string>
|
||||
<string name="apk_info_signature_scheme">签名方案</string>
|
||||
<string name="dialog_button_file_information">文件信息</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1123,5 +1123,8 @@
|
||||
<string name="text_version_code_with_computing" tools:ignore="TypographyEllipsis">Version code (computing...)</string>
|
||||
<string name="default_build_apk_version_name" translatable="false">1.0.0</string>
|
||||
<string name="default_build_apk_version_code" translatable="false">1</string>
|
||||
<string name="apk_info_file_size">File size</string>
|
||||
<string name="apk_info_signature_scheme">Signature</string>
|
||||
<string name="dialog_button_file_information">File info</string>
|
||||
|
||||
</resources>
|
||||
|
||||
Reference in New Issue
Block a user