diff --git a/app/src/main/kotlin/rasel/lunar/launcher/apps/AppMenu.kt b/app/src/main/kotlin/rasel/lunar/launcher/apps/AppMenu.kt index 7714c05..c6531c6 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/apps/AppMenu.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/apps/AppMenu.kt @@ -78,8 +78,8 @@ internal class AppMenu : BottomSheetDialogFragment() { private lateinit var binding: AppMenuBinding private lateinit var packageName: String private lateinit var packageManager: PackageManager - private lateinit var appInfo: ApplicationInfo private lateinit var defAppName: String + var appInfo: ApplicationInfo? = null override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { binding = AppMenuBinding.inflate(inflater, container, false) @@ -90,32 +90,57 @@ internal class AppMenu : BottomSheetDialogFragment() { /* get application info */ appInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - packageManager.getApplicationInfo(packageName, - PackageManager.ApplicationInfoFlags.of(PackageManager.GET_META_DATA.toLong())) + try { + packageManager.getApplicationInfo(packageName, + PackageManager.ApplicationInfoFlags.of(PackageManager.GET_META_DATA.toLong())) + }catch (e :Exception) { + null + } + } else { - packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA) + try { + packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA) + }catch (e :Exception) { + null + } } + if(appInfo == null){ + WorkersDb.getRealm().apply { + writeBlocking { + defAppName = "" + var result = query("pkgName == $0", packageName).find() + if (result.size > 0) { + val app = result.first() + delete(app) + } + } + dismiss() + } + } else { - /* get default app name */ - defAppName = packageManager.resolveActivity(Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER) - .setPackage(packageName), 0)?.loadLabel(packageManager).toString() - WorkersDb.getRealm().apply { - writeBlocking { - var result = query("pkgName == $0",packageName).find() - if(result.size > 0) { - val app = result.first() - binding.totalTouch.text = "총 실행 횟수 : ".plus(app.clickCount.toString()) - binding.lastTouchDate.text = "최종 실행 일시 : ".plus(SimpleDateFormat("yyyy-MM-dd HH:mm").format(Date(app.lastUseDate))) + /* get default app name */ + defAppName = packageManager.resolveActivity( + Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER) + .setPackage(packageName), 0 + )?.loadLabel(packageManager).toString() + WorkersDb.getRealm().apply { + writeBlocking { + var result = query("pkgName == $0", packageName).find() + if (result.size > 0) { + val app = result.first() + binding.totalTouch.text = "총 실행 횟수 : ".plus(app.clickCount.toString()) + binding.lastTouchDate.text = + "최종 실행 일시 : ".plus(SimpleDateFormat("yyyy-MM-dd HH:mm").format(Date(app.lastUseDate))) // app.clickCount = app.clickCount + 15 // app.lastUseDate = Math.max(app.lastUseDate, System.currentTimeMillis()) // app.clickCount = app.clickCount + 15 // app.lastUseDate = Math.max(app.lastUseDate, System.currentTimeMillis()) + } } } } - fun update() { WorkersDb.getRealm().apply { writeBlocking { @@ -127,7 +152,7 @@ internal class AppMenu : BottomSheetDialogFragment() { } } } -binding.totalTouch.setOnClickListener { update() } + binding.totalTouch.setOnClickListener { update() } binding.lastTouchDate.setOnClickListener { update() } /* set application name and package name */ binding.appName.apply { @@ -201,26 +226,28 @@ binding.totalTouch.setOnClickListener { update() } .setPositiveButton(android.R.string.cancel, null) .show() - /* show app name */ - dialogBinding.appName.text = packageManager.getApplicationLabel(appInfo) + appInfo?.let { appInfo -> + dialogBinding.appName.text = packageManager.getApplicationLabel(appInfo) - /* get package info */ - val packageInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - packageManager.getPackageInfo(packageName, PackageManager.PackageInfoFlags.of(0)) - } else { - packageManager.getPackageInfo(packageName, 0) + /* get package info */ + val packageInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + packageManager.getPackageInfo(packageName, PackageManager.PackageInfoFlags.of(0)) + } else { + packageManager.getPackageInfo(packageName, 0) + } + + /* show infos */ + dialogBinding.mixed.text = + "${resources.getString(R.string.version)}: ${packageInfo.versionName} (${PackageInfoCompat.getLongVersionCode(packageInfo).toInt()})\n" + + "${resources.getString(R.string.sdk)}: ${appInfo.minSdkVersion} ~ ${appInfo.targetSdkVersion}\n" + + "${resources.getString(R.string.uid)}: ${appInfo.uid}\n" + + "${resources.getString(R.string.first_install)}: ${dateTimeFormat(packageInfo.firstInstallTime)}\n" + + "${resources.getString(R.string.last_update)}: ${dateTimeFormat(packageInfo.lastUpdateTime)}" + + /* show permissions */ + dialogBinding.permissions.text = permissionsList } - /* show infos */ - dialogBinding.mixed.text = - "${resources.getString(R.string.version)}: ${packageInfo.versionName} (${PackageInfoCompat.getLongVersionCode(packageInfo).toInt()})\n" + - "${resources.getString(R.string.sdk)}: ${appInfo.minSdkVersion} ~ ${appInfo.targetSdkVersion}\n" + - "${resources.getString(R.string.uid)}: ${appInfo.uid}\n" + - "${resources.getString(R.string.first_install)}: ${dateTimeFormat(packageInfo.firstInstallTime)}\n" + - "${resources.getString(R.string.last_update)}: ${dateTimeFormat(packageInfo.lastUpdateTime)}" - - /* show permissions */ - dialogBinding.permissions.text = permissionsList } /* activity browser dialog */ @@ -231,51 +258,55 @@ binding.totalTouch.setOnClickListener { update() } .setPositiveButton(android.R.string.cancel, null) .show() - /* show app name */ - dialogBinding.appName.text = packageManager.getApplicationLabel(appInfo) + appInfo?.let { appInfo -> - /* get activity info */ - val activityInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - packageManager.getPackageInfo( - packageName, PackageManager.PackageInfoFlags.of(PackageManager.GET_ACTIVITIES.toLong()) - ) - } else { - packageManager.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES) - } -// BLog.LOGE("activity. >>>>> ${Gson().toJson(activityInfo)}") - /* show activity list */ - val activityAdapter: ArrayAdapter = - ArrayAdapter(requireContext(), R.layout.list_item, R.id.itemText, ArrayList()) - if (activityInfo.activities.isNotEmpty()) { - for (activity in activityInfo.activities) { - if (packageName.contains("com.kakao") == true) { -// BLog.LOGE("activity. >>>>> ${Gson().toJson(activity)}") - } - activityAdapter.add( - activity.toString().split(" ").toTypedArray()[1].replace("}", "") + + /* show app name */ + dialogBinding.appName.text = packageManager.getApplicationLabel(appInfo) + + /* get activity info */ + val activityInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + packageManager.getPackageInfo( + packageName, PackageManager.PackageInfoFlags.of(PackageManager.GET_ACTIVITIES.toLong()) ) + } else { + packageManager.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES) } - dialogBinding.activityList.adapter = activityAdapter - } - - /* listen item clicks */ - dialogBinding.activityList.onItemClickListener = - AdapterView.OnItemClickListener { _: AdapterView<*>?, _: View?, i: Int, _: Long -> - try { - /* open activity */ - val intent = Intent() - intent.component = ComponentName(packageName, activityAdapter.getItem(i).toString()) - intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK - requireContext().startActivity(intent) - } catch (exception: Exception) { - /* couldn't open activity */ - exception.printStackTrace() - val exceptionShort = (exception.toString().split(": ").toTypedArray())[0] - Toast.makeText(requireContext(), - "${resources.getString(R.string.unable_to_launch)} -\n$exceptionShort", Toast.LENGTH_LONG).show() +// BLog.LOGE("activity. >>>>> ${Gson().toJson(activityInfo)}") + /* show activity list */ + val activityAdapter: ArrayAdapter = + ArrayAdapter(requireContext(), R.layout.list_item, R.id.itemText, ArrayList()) + if (activityInfo.activities.isNotEmpty()) { + for (activity in activityInfo.activities) { + if (packageName.contains("com.kakao") == true) { +// BLog.LOGE("activity. >>>>> ${Gson().toJson(activity)}") + } + activityAdapter.add( + activity.toString().split(" ").toTypedArray()[1].replace("}", "") + ) } - dialogBuilder.dismiss() + dialogBinding.activityList.adapter = activityAdapter } + + /* listen item clicks */ + dialogBinding.activityList.onItemClickListener = + AdapterView.OnItemClickListener { _: AdapterView<*>?, _: View?, i: Int, _: Long -> + try { + /* open activity */ + val intent = Intent() + intent.component = ComponentName(packageName, activityAdapter.getItem(i).toString()) + intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK + requireContext().startActivity(intent) + } catch (exception: Exception) { + /* couldn't open activity */ + exception.printStackTrace() + val exceptionShort = (exception.toString().split(": ").toTypedArray())[0] + Toast.makeText(requireContext(), + "${resources.getString(R.string.unable_to_launch)} -\n$exceptionShort", Toast.LENGTH_LONG).show() + } + dialogBuilder.dismiss() + } + } } /* open app's page in app store/market */ @@ -317,35 +348,42 @@ binding.totalTouch.setOnClickListener { update() } private fun share() { try { - // Create a temporary file to copy the APK - val apkLabel = packageManager.getApplicationLabel(appInfo).toString().lowercase().replace(" ", "_") - val tempApkFile = File(requireContext().externalCacheDir, "$apkLabel.apk") + appInfo?.let { appInfo -> + // Create a temporary file to copy the APK + val apkLabel = packageManager.getApplicationLabel(appInfo).toString().lowercase() + .replace(" ", "_") + val tempApkFile = File(requireContext().externalCacheDir, "$apkLabel.apk") - // Copy the APK file - FileInputStream(File(appInfo.sourceDir)).use { `in` -> - FileOutputStream(tempApkFile).use { out -> - val buffer = ByteArray(1024) - var length: Int - while (`in`.read(buffer).also { length = it } > 0) { - out.write(buffer, 0, length) + // Copy the APK file + FileInputStream(File(appInfo.sourceDir)).use { `in` -> + FileOutputStream(tempApkFile).use { out -> + val buffer = ByteArray(1024) + var length: Int + while (`in`.read(buffer).also { length = it } > 0) { + out.write(buffer, 0, length) + } } } - } - // Generate a content URI using FileProvider - val contentUri = - FileProvider.getUriForFile(requireContext(), "${requireContext().packageName}.fileprovider", tempApkFile) + // Generate a content URI using FileProvider + val contentUri = + FileProvider.getUriForFile( + requireContext(), + "${requireContext().packageName}.fileprovider", + tempApkFile + ) - //requireContext().grantUriPermission(receivers.package.name, contentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION) + //requireContext().grantUriPermission(receivers.package.name, contentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION) - // Create a Share Intent - Intent(Intent.ACTION_SEND).apply { - type = "application/vnd.android.package-archive" - putExtra(Intent.EXTRA_STREAM, contentUri) - addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) - }.let { - // Start the chooser activity - startActivity(Intent.createChooser(it, getString(R.string.share_apk_message))) + // Create a Share Intent + Intent(Intent.ACTION_SEND).apply { + type = "application/vnd.android.package-archive" + putExtra(Intent.EXTRA_STREAM, contentUri) + addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + }.let { + // Start the chooser activity + startActivity(Intent.createChooser(it, getString(R.string.share_apk_message))) + } } } catch (e: PackageManager.NameNotFoundException) { e.printStackTrace() } diff --git a/app/src/main/kotlin/rasel/lunar/launcher/workers/AppInfoGetter.kt b/app/src/main/kotlin/rasel/lunar/launcher/workers/AppInfoGetter.kt index aa2af23..7e63e0c 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/workers/AppInfoGetter.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/workers/AppInfoGetter.kt @@ -25,6 +25,7 @@ class AppInfoGetter : BaseGetter { } override fun realWork(): Result { try { + var packageManager = lActivity?.packageManager var packageInfoList: MutableList = mutableListOf() packageInfoList = (if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { diff --git a/app/src/main/kotlin/rasel/lunar/launcher/workers/LocationGetter.kt b/app/src/main/kotlin/rasel/lunar/launcher/workers/LocationGetter.kt index b415942..1f67083 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/workers/LocationGetter.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/workers/LocationGetter.kt @@ -138,4 +138,9 @@ fun longitudeRange(latitude: Double, longitude: Double, radiusInMeters: Int): Do val maxLongitude = longitude + degreeRange return doubleArrayOf(minLongitude, maxLongitude) -} \ No newline at end of file +} + + +//https://jinkpark.tistory.com/296 +//https://develoyummer.tistory.com/103 +//https://ghj1001020.tistory.com/300 \ No newline at end of file