- Renamed the package Name

- Update some features
- Fix some bugs
This commit is contained in:
2026-03-08 11:39:00 +01:00
parent d5789bb124
commit 24ff71b1fa
70 changed files with 421 additions and 439 deletions
+2 -2
View File
@@ -13,11 +13,11 @@ buildscript {
apply plugin: 'com.android.application'
android {
namespace 'nya.kitsunyan.foxydroid'
namespace 'com.michatec.store'
compileSdk 36
defaultConfig {
applicationId 'nya.kitsunyan.foxydroid'
applicationId 'com.michatec.store'
minSdk 30
targetSdk 36
versionCode 15
+1 -1
View File
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.0-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
+4 -4
View File
@@ -4,18 +4,18 @@
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<queries>
<intent>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent>
<package android:name="com.android.vending" />
</queries>
<application
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid
package com.michatec.store
object Common {
const val NOTIFICATION_CHANNEL_SYNCING = "syncing"
@@ -1,7 +1,7 @@
package nya.kitsunyan.foxydroid
package com.michatec.store
import android.content.Intent
import nya.kitsunyan.foxydroid.screen.ScreenActivity
import com.michatec.store.screen.ScreenActivity
class MainActivity: ScreenActivity() {
companion object {
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid
package com.michatec.store
import android.annotation.SuppressLint
import android.app.Application
@@ -13,18 +13,18 @@ import android.content.pm.PackageInfo
import com.squareup.picasso.OkHttp3Downloader
import com.squareup.picasso.Picasso
import io.reactivex.rxjava3.disposables.Disposable
import nya.kitsunyan.foxydroid.content.Cache
import nya.kitsunyan.foxydroid.content.Preferences
import nya.kitsunyan.foxydroid.content.ProductPreferences
import nya.kitsunyan.foxydroid.database.Database
import nya.kitsunyan.foxydroid.entity.InstalledItem
import nya.kitsunyan.foxydroid.index.RepositoryUpdater
import nya.kitsunyan.foxydroid.network.Downloader
import nya.kitsunyan.foxydroid.network.PicassoDownloader
import nya.kitsunyan.foxydroid.service.Connection
import nya.kitsunyan.foxydroid.service.SyncService
import nya.kitsunyan.foxydroid.utility.Utils
import nya.kitsunyan.foxydroid.utility.extension.android.*
import com.michatec.store.content.Cache
import com.michatec.store.content.Preferences
import com.michatec.store.content.ProductPreferences
import com.michatec.store.database.Database
import com.michatec.store.entity.InstalledItem
import com.michatec.store.index.RepositoryUpdater
import com.michatec.store.network.Downloader
import com.michatec.store.network.PicassoDownloader
import com.michatec.store.service.Connection
import com.michatec.store.service.SyncService
import com.michatec.store.utility.Utils
import com.michatec.store.utility.extension.android.*
import java.net.InetSocketAddress
import java.net.Proxy
@@ -61,6 +61,7 @@ class MainApplication: Application() {
updateSyncJob(false)
}
@SuppressLint("QueryPermissionsNeeded")
private fun listenApplications() {
registerReceiver(object: BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.content
package com.michatec.store.content
import android.content.ContentProvider
import android.content.ContentValues
@@ -10,7 +10,7 @@ import android.net.Uri
import android.os.ParcelFileDescriptor
import android.provider.OpenableColumns
import android.system.Os
import nya.kitsunyan.foxydroid.utility.extension.android.*
import com.michatec.store.utility.extension.android.*
import java.io.File
import java.util.UUID
import kotlin.concurrent.thread
@@ -1,13 +1,13 @@
package nya.kitsunyan.foxydroid.content
package com.michatec.store.content
import android.content.Context
import android.content.SharedPreferences
import android.content.res.Configuration
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.subjects.PublishSubject
import nya.kitsunyan.foxydroid.R
import nya.kitsunyan.foxydroid.entity.ProductItem
import nya.kitsunyan.foxydroid.utility.extension.android.*
import com.michatec.store.R
import com.michatec.store.entity.ProductItem
import com.michatec.store.utility.extension.android.*
import java.net.Proxy
import androidx.core.content.edit
@@ -1,15 +1,14 @@
package nya.kitsunyan.foxydroid.content
package com.michatec.store.content
import android.content.Context
import android.content.SharedPreferences
import io.reactivex.rxjava3.disposables.Disposable
import io.reactivex.rxjava3.schedulers.Schedulers
import io.reactivex.rxjava3.subjects.PublishSubject
import nya.kitsunyan.foxydroid.database.Database
import nya.kitsunyan.foxydroid.entity.ProductPreference
import nya.kitsunyan.foxydroid.utility.extension.json.*
import com.michatec.store.database.Database
import com.michatec.store.entity.ProductPreference
import com.michatec.store.utility.extension.json.*
import java.io.ByteArrayOutputStream
import java.nio.charset.Charset
import androidx.core.content.edit
object ProductPreferences {
@@ -57,15 +56,14 @@ object ProductPreferences {
operator fun set(packageName: String, productPreference: ProductPreference) {
val oldProductPreference = this[packageName]
val json = ByteArrayOutputStream().apply {
Json.factory.createGenerator(this).use { it.writeDictionary(productPreference::serialize) }
}.toByteArray().toString(Charsets.UTF_8)
preferences.edit {
putString(
packageName, ByteArrayOutputStream()
.apply {
Json.factory.createGenerator(this)
.use { it.writeDictionary(productPreference::serialize) }
}
.toByteArray().toString(Charset.defaultCharset()))
putString(packageName, json)
}
if (oldProductPreference.ignoreUpdates != productPreference.ignoreUpdates ||
oldProductPreference.ignoreVersionCode != productPreference.ignoreVersionCode) {
subject.onNext(Pair(packageName, productPreference.databaseVersionCode))
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.database
package com.michatec.store.database
import android.database.Cursor
import android.os.Bundle
@@ -7,7 +7,7 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.loader.app.LoaderManager
import androidx.loader.content.Loader
import nya.kitsunyan.foxydroid.entity.ProductItem
import com.michatec.store.entity.ProductItem
class CursorOwner: Fragment(), LoaderManager.LoaderCallbacks<Cursor> {
sealed class Request {
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.database
package com.michatec.store.database
import android.content.ContentValues
import android.content.Context
@@ -9,12 +9,12 @@ import android.os.CancellationSignal
import com.fasterxml.jackson.core.JsonGenerator
import com.fasterxml.jackson.core.JsonParser
import io.reactivex.rxjava3.core.Observable
import nya.kitsunyan.foxydroid.entity.InstalledItem
import nya.kitsunyan.foxydroid.entity.Product
import nya.kitsunyan.foxydroid.entity.ProductItem
import nya.kitsunyan.foxydroid.entity.Repository
import nya.kitsunyan.foxydroid.utility.extension.android.*
import nya.kitsunyan.foxydroid.utility.extension.json.*
import com.michatec.store.entity.InstalledItem
import com.michatec.store.entity.Product
import com.michatec.store.entity.ProductItem
import com.michatec.store.entity.Repository
import com.michatec.store.utility.extension.android.*
import com.michatec.store.utility.extension.json.*
import java.io.ByteArrayOutputStream
import androidx.core.database.sqlite.transaction
@@ -155,7 +155,7 @@ object Database {
}
}
private class Helper(context: Context): SQLiteOpenHelper(context, "foxydroid", null, 1) {
private class Helper(context: Context): SQLiteOpenHelper(context, "store", null, 1) {
var created = false
private set
var updated = false
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.database
package com.michatec.store.database
import android.database.ContentObserver
import android.database.Cursor
@@ -1,11 +1,11 @@
package nya.kitsunyan.foxydroid.database
package com.michatec.store.database
import android.database.Cursor
import android.database.sqlite.SQLiteDatabase
import android.os.CancellationSignal
import nya.kitsunyan.foxydroid.BuildConfig
import nya.kitsunyan.foxydroid.utility.extension.android.*
import nya.kitsunyan.foxydroid.utility.extension.text.*
import com.michatec.store.BuildConfig
import com.michatec.store.utility.extension.android.*
import com.michatec.store.utility.extension.text.*
class QueryBuilder {
companion object {
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.database
package com.michatec.store.database
import android.content.Context
import android.database.Cursor
@@ -1,3 +1,3 @@
package nya.kitsunyan.foxydroid.entity
package com.michatec.store.entity
class InstalledItem(val packageName: String, val version: String, val versionCode: Long, val signature: String)
@@ -1,10 +1,10 @@
package nya.kitsunyan.foxydroid.entity
package com.michatec.store.entity
import com.fasterxml.jackson.core.JsonGenerator
import com.fasterxml.jackson.core.JsonParser
import com.fasterxml.jackson.core.JsonToken
import nya.kitsunyan.foxydroid.utility.extension.json.*
import nya.kitsunyan.foxydroid.utility.extension.text.*
import com.michatec.store.utility.extension.json.*
import com.michatec.store.utility.extension.text.*
data class Product(val repositoryId: Long, val packageName: String, val name: String, val summary: String,
val description: String, val whatsNew: String, val icon: String, val metadataIcon: String, val author: Author,
@@ -1,11 +1,11 @@
package nya.kitsunyan.foxydroid.entity
package com.michatec.store.entity
import android.os.Parcel
import com.fasterxml.jackson.core.JsonGenerator
import com.fasterxml.jackson.core.JsonParser
import nya.kitsunyan.foxydroid.R
import nya.kitsunyan.foxydroid.utility.KParcelable
import nya.kitsunyan.foxydroid.utility.extension.json.*
import com.michatec.store.R
import com.michatec.store.utility.KParcelable
import com.michatec.store.utility.extension.json.*
data class ProductItem(val repositoryId: Long, val packageName: String, val name: String, val summary: String,
val icon: String, val metadataIcon: String, val version: String, val installedVersion: String,
@@ -1,8 +1,8 @@
package nya.kitsunyan.foxydroid.entity
package com.michatec.store.entity
import com.fasterxml.jackson.core.JsonGenerator
import com.fasterxml.jackson.core.JsonParser
import nya.kitsunyan.foxydroid.utility.extension.json.*
import com.michatec.store.utility.extension.json.*
data class ProductPreference(val ignoreUpdates: Boolean, val ignoreVersionCode: Long) {
fun shouldIgnoreUpdate(versionCode: Long): Boolean {
@@ -1,9 +1,9 @@
package nya.kitsunyan.foxydroid.entity
package com.michatec.store.entity
import com.fasterxml.jackson.core.JsonGenerator
import com.fasterxml.jackson.core.JsonParser
import com.fasterxml.jackson.core.JsonToken
import nya.kitsunyan.foxydroid.utility.extension.json.*
import com.michatec.store.utility.extension.json.*
import androidx.core.net.toUri
data class Release(val selected: Boolean, val version: String, val versionCode: Long,
@@ -1,8 +1,8 @@
package nya.kitsunyan.foxydroid.entity
package com.michatec.store.entity
import com.fasterxml.jackson.core.JsonGenerator
import com.fasterxml.jackson.core.JsonParser
import nya.kitsunyan.foxydroid.utility.extension.json.*
import com.michatec.store.utility.extension.json.*
data class Repository(
val id: Long, val address: String, val mirrors: List<String>,
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.graphics
package com.michatec.store.graphics
import android.content.res.ColorStateList
import android.graphics.Canvas
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.graphics
package com.michatec.store.graphics
import android.graphics.Rect
import android.graphics.drawable.Drawable
@@ -1,8 +1,8 @@
package nya.kitsunyan.foxydroid.index
package com.michatec.store.index
import nya.kitsunyan.foxydroid.entity.Product
import nya.kitsunyan.foxydroid.entity.Release
import nya.kitsunyan.foxydroid.utility.extension.android.*
import com.michatec.store.entity.Product
import com.michatec.store.entity.Release
import com.michatec.store.utility.extension.android.*
import org.xml.sax.Attributes
import org.xml.sax.helpers.DefaultHandler
import java.text.SimpleDateFormat
@@ -1,12 +1,12 @@
package nya.kitsunyan.foxydroid.index
package com.michatec.store.index
import android.content.ContentValues
import android.database.sqlite.SQLiteDatabase
import com.fasterxml.jackson.core.JsonToken
import nya.kitsunyan.foxydroid.entity.Product
import nya.kitsunyan.foxydroid.entity.Release
import nya.kitsunyan.foxydroid.utility.extension.android.*
import nya.kitsunyan.foxydroid.utility.extension.json.*
import com.michatec.store.entity.Product
import com.michatec.store.entity.Release
import com.michatec.store.utility.extension.android.*
import com.michatec.store.utility.extension.json.*
import java.io.ByteArrayOutputStream
import java.io.Closeable
import java.io.File
@@ -1,12 +1,12 @@
package nya.kitsunyan.foxydroid.index
package com.michatec.store.index
import com.fasterxml.jackson.core.JsonParser
import com.fasterxml.jackson.core.JsonToken
import nya.kitsunyan.foxydroid.entity.Product
import nya.kitsunyan.foxydroid.entity.Release
import nya.kitsunyan.foxydroid.utility.extension.android.*
import nya.kitsunyan.foxydroid.utility.extension.json.*
import nya.kitsunyan.foxydroid.utility.extension.text.*
import com.michatec.store.entity.Product
import com.michatec.store.entity.Release
import com.michatec.store.utility.extension.android.*
import com.michatec.store.utility.extension.json.*
import com.michatec.store.utility.extension.text.*
import java.io.InputStream
object IndexV1Parser {
@@ -1,21 +1,21 @@
package nya.kitsunyan.foxydroid.index
package com.michatec.store.index
import android.content.Context
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Single
import io.reactivex.rxjava3.disposables.Disposable
import io.reactivex.rxjava3.schedulers.Schedulers
import nya.kitsunyan.foxydroid.content.Cache
import nya.kitsunyan.foxydroid.database.Database
import nya.kitsunyan.foxydroid.entity.Product
import nya.kitsunyan.foxydroid.entity.Release
import nya.kitsunyan.foxydroid.entity.Repository
import nya.kitsunyan.foxydroid.network.Downloader
import nya.kitsunyan.foxydroid.utility.ProgressInputStream
import nya.kitsunyan.foxydroid.utility.RxUtils
import nya.kitsunyan.foxydroid.utility.Utils
import nya.kitsunyan.foxydroid.utility.extension.android.*
import nya.kitsunyan.foxydroid.utility.extension.text.*
import com.michatec.store.content.Cache
import com.michatec.store.database.Database
import com.michatec.store.entity.Product
import com.michatec.store.entity.Release
import com.michatec.store.entity.Repository
import com.michatec.store.network.Downloader
import com.michatec.store.utility.ProgressInputStream
import com.michatec.store.utility.RxUtils
import com.michatec.store.utility.Utils
import com.michatec.store.utility.extension.android.*
import com.michatec.store.utility.extension.text.*
import org.xml.sax.InputSource
import java.io.File
import java.security.cert.X509Certificate
@@ -1,9 +1,9 @@
package nya.kitsunyan.foxydroid.network
package com.michatec.store.network
import io.reactivex.rxjava3.core.Single
import io.reactivex.rxjava3.schedulers.Schedulers
import nya.kitsunyan.foxydroid.utility.ProgressInputStream
import nya.kitsunyan.foxydroid.utility.RxUtils
import com.michatec.store.utility.ProgressInputStream
import com.michatec.store.utility.RxUtils
import okhttp3.Cache
import okhttp3.Call
import okhttp3.OkHttpClient
@@ -1,11 +1,11 @@
package nya.kitsunyan.foxydroid.network
package com.michatec.store.network
import android.content.Context
import android.net.Uri
import android.view.View
import nya.kitsunyan.foxydroid.entity.Product
import nya.kitsunyan.foxydroid.entity.Repository
import nya.kitsunyan.foxydroid.utility.extension.text.*
import com.michatec.store.entity.Product
import com.michatec.store.entity.Repository
import com.michatec.store.utility.extension.text.*
import okhttp3.Cache
import okhttp3.Call
import okhttp3.HttpUrl.Companion.toHttpUrl
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.screen
package com.michatec.store.screen
import android.app.AlertDialog
import android.content.ClipboardManager
@@ -24,16 +24,16 @@ import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Single
import io.reactivex.rxjava3.disposables.Disposable
import io.reactivex.rxjava3.schedulers.Schedulers
import nya.kitsunyan.foxydroid.R
import nya.kitsunyan.foxydroid.database.Database
import nya.kitsunyan.foxydroid.entity.Repository
import nya.kitsunyan.foxydroid.network.Downloader
import nya.kitsunyan.foxydroid.service.Connection
import nya.kitsunyan.foxydroid.service.SyncService
import nya.kitsunyan.foxydroid.utility.RxUtils
import nya.kitsunyan.foxydroid.utility.Utils
import nya.kitsunyan.foxydroid.utility.extension.resources.*
import nya.kitsunyan.foxydroid.utility.extension.text.*
import com.michatec.store.R
import com.michatec.store.database.Database
import com.michatec.store.entity.Repository
import com.michatec.store.network.Downloader
import com.michatec.store.service.Connection
import com.michatec.store.service.SyncService
import com.michatec.store.utility.RxUtils
import com.michatec.store.utility.Utils
import com.michatec.store.utility.extension.resources.*
import com.michatec.store.utility.extension.text.*
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Request
import java.net.URI
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.screen
package com.michatec.store.screen
import android.app.AlertDialog
import android.content.ActivityNotFoundException
@@ -9,12 +9,12 @@ import android.os.Parcel
import androidx.core.os.BundleCompat
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.FragmentManager
import nya.kitsunyan.foxydroid.R
import nya.kitsunyan.foxydroid.entity.Release
import nya.kitsunyan.foxydroid.utility.KParcelable
import nya.kitsunyan.foxydroid.utility.PackageItemResolver
import nya.kitsunyan.foxydroid.utility.extension.android.*
import nya.kitsunyan.foxydroid.utility.extension.text.*
import com.michatec.store.R
import com.michatec.store.entity.Release
import com.michatec.store.utility.KParcelable
import com.michatec.store.utility.PackageItemResolver
import com.michatec.store.utility.extension.android.*
import com.michatec.store.utility.extension.text.*
import androidx.core.net.toUri
class MessageDialog(): DialogFragment() {
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.screen
package com.michatec.store.screen
import android.app.AlertDialog
import android.app.Dialog
@@ -20,9 +20,9 @@ import android.widget.Toolbar
import androidx.fragment.app.DialogFragment
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.disposables.Disposable
import nya.kitsunyan.foxydroid.R
import nya.kitsunyan.foxydroid.content.Preferences
import nya.kitsunyan.foxydroid.utility.extension.resources.*
import com.michatec.store.R
import com.michatec.store.content.Preferences
import com.michatec.store.utility.extension.resources.*
import androidx.core.view.isNotEmpty
class PreferencesFragment: ScreenFragment() {
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.screen
package com.michatec.store.screen
import android.annotation.SuppressLint
import android.content.ClipData
@@ -40,25 +40,25 @@ import androidx.core.text.HtmlCompat
import androidx.core.text.util.LinkifyCompat
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import nya.kitsunyan.foxydroid.R
import nya.kitsunyan.foxydroid.content.Preferences
import nya.kitsunyan.foxydroid.content.ProductPreferences
import nya.kitsunyan.foxydroid.entity.InstalledItem
import nya.kitsunyan.foxydroid.entity.Product
import nya.kitsunyan.foxydroid.entity.ProductPreference
import nya.kitsunyan.foxydroid.entity.Release
import nya.kitsunyan.foxydroid.entity.Repository
import nya.kitsunyan.foxydroid.graphics.PaddingDrawable
import nya.kitsunyan.foxydroid.network.PicassoDownloader
import nya.kitsunyan.foxydroid.utility.KParcelable
import nya.kitsunyan.foxydroid.utility.PackageItemResolver
import nya.kitsunyan.foxydroid.utility.Utils
import nya.kitsunyan.foxydroid.utility.extension.android.*
import nya.kitsunyan.foxydroid.utility.extension.resources.*
import nya.kitsunyan.foxydroid.utility.extension.text.*
import nya.kitsunyan.foxydroid.widget.ClickableMovementMethod
import nya.kitsunyan.foxydroid.widget.DividerItemDecoration
import nya.kitsunyan.foxydroid.widget.StableRecyclerAdapter
import com.michatec.store.R
import com.michatec.store.content.Preferences
import com.michatec.store.content.ProductPreferences
import com.michatec.store.entity.InstalledItem
import com.michatec.store.entity.Product
import com.michatec.store.entity.ProductPreference
import com.michatec.store.entity.Release
import com.michatec.store.entity.Repository
import com.michatec.store.graphics.PaddingDrawable
import com.michatec.store.network.PicassoDownloader
import com.michatec.store.utility.KParcelable
import com.michatec.store.utility.PackageItemResolver
import com.michatec.store.utility.Utils
import com.michatec.store.utility.extension.android.*
import com.michatec.store.utility.extension.resources.*
import com.michatec.store.utility.extension.text.*
import com.michatec.store.widget.ClickableMovementMethod
import com.michatec.store.widget.DividerItemDecoration
import com.michatec.store.widget.StableRecyclerAdapter
import java.lang.ref.WeakReference
import java.util.Locale
import kotlin.math.*
@@ -892,7 +892,7 @@ class ProductAdapter(private val callbacks: Callbacks, private val columns: Int)
}
ProductPreferences[switchItem.packageName] = productPreference
items.asSequence().mapIndexedNotNull { index, item -> if (item is Item.HeaderItem ||
item is Item.SectionItem) index else null }.forEach { notifyItemChanged(it, Payload.REFRESH) }
item is Item.SectionItem || item is Item.SwitchItem) index else null }.forEach { notifyItemChanged(it, Payload.REFRESH) }
callbacks.onPreferenceChanged(productPreference)
}
}
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.screen
package com.michatec.store.screen
import android.app.AlertDialog
import android.content.ActivityNotFoundException
@@ -24,20 +24,20 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.disposables.Disposable
import io.reactivex.rxjava3.schedulers.Schedulers
import nya.kitsunyan.foxydroid.R
import nya.kitsunyan.foxydroid.content.ProductPreferences
import nya.kitsunyan.foxydroid.database.Database
import nya.kitsunyan.foxydroid.entity.InstalledItem
import nya.kitsunyan.foxydroid.entity.Product
import nya.kitsunyan.foxydroid.entity.ProductPreference
import nya.kitsunyan.foxydroid.entity.Release
import nya.kitsunyan.foxydroid.entity.Repository
import nya.kitsunyan.foxydroid.service.Connection
import nya.kitsunyan.foxydroid.service.DownloadService
import nya.kitsunyan.foxydroid.utility.RxUtils
import nya.kitsunyan.foxydroid.utility.Utils
import nya.kitsunyan.foxydroid.utility.extension.android.*
import nya.kitsunyan.foxydroid.widget.DividerItemDecoration
import com.michatec.store.R
import com.michatec.store.content.ProductPreferences
import com.michatec.store.database.Database
import com.michatec.store.entity.InstalledItem
import com.michatec.store.entity.Product
import com.michatec.store.entity.ProductPreference
import com.michatec.store.entity.Release
import com.michatec.store.entity.Repository
import com.michatec.store.service.Connection
import com.michatec.store.service.DownloadService
import com.michatec.store.utility.RxUtils
import com.michatec.store.utility.Utils
import com.michatec.store.utility.extension.android.*
import com.michatec.store.widget.DividerItemDecoration
import androidx.core.net.toUri
class ProductFragment(): ScreenFragment(), ProductAdapter.Callbacks {
@@ -271,8 +271,8 @@ class ProductFragment(): ScreenFragment(), ProductAdapter.Callbacks {
val toolbar = toolbar
if (toolbar != null) {
for (action in sequenceOf(Action.INSTALL, Action.UPDATE, Action.UNINSTALL)) {
toolbar.menu.findItem(action.id).isEnabled = !downloading
for (action in sequenceOf(Action.INSTALL, Action.UPDATE, Action.UNINSTALL)) {
toolbar.menu.findItem(action.id).isEnabled = !downloading
}
}
this.actions = Pair(actions, primaryAction)
@@ -349,7 +349,6 @@ class ProductFragment(): ScreenFragment(), ProductAdapter.Callbacks {
if (productRepository != null && release != null && binder != null) {
binder.enqueue(packageName, productRepository.first.name, productRepository.second, release)
}
Unit
}
ProductAdapter.Action.LAUNCH -> {
val launcherActivities = installed?.launcherActivities.orEmpty()
@@ -358,7 +357,6 @@ class ProductFragment(): ScreenFragment(), ProductAdapter.Callbacks {
} else {
launcherActivities.firstOrNull()?.let { startLauncherActivity(it.first) }
}
Unit
}
ProductAdapter.Action.DETAILS -> {
startActivity(Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
@@ -373,9 +371,8 @@ class ProductFragment(): ScreenFragment(), ProductAdapter.Callbacks {
if (downloading && binder != null) {
binder.cancel(packageName)
}
Unit
}
}::class
}
}
private fun startLauncherActivity(name: String) {
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.screen
package com.michatec.store.screen
import android.annotation.SuppressLint
import android.content.Context
@@ -13,16 +13,16 @@ import android.widget.ImageView
import android.widget.ProgressBar
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import nya.kitsunyan.foxydroid.R
import nya.kitsunyan.foxydroid.database.Database
import nya.kitsunyan.foxydroid.entity.ProductItem
import nya.kitsunyan.foxydroid.entity.Repository
import nya.kitsunyan.foxydroid.network.PicassoDownloader
import nya.kitsunyan.foxydroid.utility.Utils
import nya.kitsunyan.foxydroid.utility.extension.resources.*
import nya.kitsunyan.foxydroid.utility.extension.text.*
import nya.kitsunyan.foxydroid.widget.CursorRecyclerAdapter
import nya.kitsunyan.foxydroid.widget.DividerItemDecoration
import com.michatec.store.R
import com.michatec.store.database.Database
import com.michatec.store.entity.ProductItem
import com.michatec.store.entity.Repository
import com.michatec.store.network.PicassoDownloader
import com.michatec.store.utility.Utils
import com.michatec.store.utility.extension.resources.*
import com.michatec.store.utility.extension.text.*
import com.michatec.store.widget.CursorRecyclerAdapter
import com.michatec.store.widget.DividerItemDecoration
class ProductsAdapter(private val onClick: (ProductItem) -> Unit):
CursorRecyclerAdapter<ProductsAdapter.ViewType, RecyclerView.ViewHolder>() {
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.screen
package com.michatec.store.screen
import android.database.Cursor
import android.os.Bundle
@@ -13,13 +13,13 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.disposables.Disposable
import io.reactivex.rxjava3.schedulers.Schedulers
import nya.kitsunyan.foxydroid.R
import nya.kitsunyan.foxydroid.database.CursorOwner
import nya.kitsunyan.foxydroid.database.Database
import nya.kitsunyan.foxydroid.entity.ProductItem
import nya.kitsunyan.foxydroid.utility.RxUtils
import nya.kitsunyan.foxydroid.widget.DividerItemDecoration
import nya.kitsunyan.foxydroid.widget.RecyclerFastScroller
import com.michatec.store.R
import com.michatec.store.database.CursorOwner
import com.michatec.store.database.Database
import com.michatec.store.entity.ProductItem
import com.michatec.store.utility.RxUtils
import com.michatec.store.widget.DividerItemDecoration
import com.michatec.store.widget.RecyclerFastScroller
class ProductsFragment(): ScreenFragment(), CursorOwner.Callback {
companion object {
@@ -1,15 +1,15 @@
package nya.kitsunyan.foxydroid.screen
package com.michatec.store.screen
import android.view.View
import android.view.ViewGroup
import android.widget.Switch
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import nya.kitsunyan.foxydroid.R
import nya.kitsunyan.foxydroid.database.Database
import nya.kitsunyan.foxydroid.entity.Repository
import nya.kitsunyan.foxydroid.utility.extension.resources.*
import nya.kitsunyan.foxydroid.widget.CursorRecyclerAdapter
import com.michatec.store.R
import com.michatec.store.database.Database
import com.michatec.store.entity.Repository
import com.michatec.store.utility.extension.resources.*
import com.michatec.store.widget.CursorRecyclerAdapter
class RepositoriesAdapter(private val onClick: (Repository) -> Unit,
private val onSwitch: (repository: Repository, isEnabled: Boolean) -> Boolean):
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.screen
package com.michatec.store.screen
import android.database.Cursor
import android.os.Bundle
@@ -10,11 +10,11 @@ import android.widget.FrameLayout
import android.widget.Toolbar
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import nya.kitsunyan.foxydroid.R
import nya.kitsunyan.foxydroid.database.CursorOwner
import nya.kitsunyan.foxydroid.service.Connection
import nya.kitsunyan.foxydroid.service.SyncService
import nya.kitsunyan.foxydroid.utility.Utils
import com.michatec.store.R
import com.michatec.store.database.CursorOwner
import com.michatec.store.service.Connection
import com.michatec.store.service.SyncService
import com.michatec.store.utility.Utils
class RepositoriesFragment: ScreenFragment(), CursorOwner.Callback {
private var recyclerView: RecyclerView? = null
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.screen
package com.michatec.store.screen
import android.os.Bundle
import android.text.SpannableStringBuilder
@@ -17,12 +17,12 @@ import android.widget.Toolbar
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.disposables.Disposable
import nya.kitsunyan.foxydroid.R
import nya.kitsunyan.foxydroid.database.Database
import nya.kitsunyan.foxydroid.service.Connection
import nya.kitsunyan.foxydroid.service.SyncService
import nya.kitsunyan.foxydroid.utility.Utils
import nya.kitsunyan.foxydroid.utility.extension.resources.*
import com.michatec.store.R
import com.michatec.store.database.Database
import com.michatec.store.service.Connection
import com.michatec.store.service.SyncService
import com.michatec.store.utility.Utils
import com.michatec.store.utility.extension.resources.*
import java.util.Date
import java.util.Locale
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.screen
package com.michatec.store.screen
import android.content.Context
import android.content.Intent
@@ -14,15 +14,15 @@ import androidx.core.os.BundleCompat
import androidx.core.view.WindowCompat
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import nya.kitsunyan.foxydroid.R
import nya.kitsunyan.foxydroid.content.Cache
import nya.kitsunyan.foxydroid.content.Preferences
import nya.kitsunyan.foxydroid.database.CursorOwner
import nya.kitsunyan.foxydroid.utility.KParcelable
import nya.kitsunyan.foxydroid.utility.Utils
import nya.kitsunyan.foxydroid.utility.extension.android.*
import nya.kitsunyan.foxydroid.utility.extension.resources.*
import nya.kitsunyan.foxydroid.utility.extension.text.*
import com.michatec.store.R
import com.michatec.store.content.Cache
import com.michatec.store.content.Preferences
import com.michatec.store.database.CursorOwner
import com.michatec.store.utility.KParcelable
import com.michatec.store.utility.Utils
import com.michatec.store.utility.extension.android.*
import com.michatec.store.utility.extension.resources.*
import com.michatec.store.utility.extension.text.*
abstract class ScreenActivity: FragmentActivity() {
companion object {
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.screen
package com.michatec.store.screen
import androidx.fragment.app.Fragment
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.screen
package com.michatec.store.screen
import android.app.Dialog
import android.content.Context
@@ -22,16 +22,16 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.disposables.Disposable
import io.reactivex.rxjava3.schedulers.Schedulers
import nya.kitsunyan.foxydroid.R
import nya.kitsunyan.foxydroid.database.Database
import nya.kitsunyan.foxydroid.entity.Product
import nya.kitsunyan.foxydroid.entity.Repository
import nya.kitsunyan.foxydroid.graphics.PaddingDrawable
import nya.kitsunyan.foxydroid.network.PicassoDownloader
import nya.kitsunyan.foxydroid.utility.RxUtils
import nya.kitsunyan.foxydroid.utility.extension.android.*
import nya.kitsunyan.foxydroid.utility.extension.resources.*
import nya.kitsunyan.foxydroid.widget.StableRecyclerAdapter
import com.michatec.store.R
import com.michatec.store.database.Database
import com.michatec.store.entity.Product
import com.michatec.store.entity.Repository
import com.michatec.store.graphics.PaddingDrawable
import com.michatec.store.network.PicassoDownloader
import com.michatec.store.utility.RxUtils
import com.michatec.store.utility.extension.android.*
import com.michatec.store.utility.extension.resources.*
import com.michatec.store.widget.StableRecyclerAdapter
class ScreenshotsFragment(): DialogFragment() {
companion object {
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.screen
package com.michatec.store.screen
import android.animation.ValueAnimator
import android.content.Context
@@ -34,19 +34,19 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.disposables.Disposable
import io.reactivex.rxjava3.schedulers.Schedulers
import nya.kitsunyan.foxydroid.R
import nya.kitsunyan.foxydroid.content.Preferences
import nya.kitsunyan.foxydroid.database.Database
import nya.kitsunyan.foxydroid.entity.ProductItem
import nya.kitsunyan.foxydroid.service.Connection
import nya.kitsunyan.foxydroid.service.SyncService
import nya.kitsunyan.foxydroid.utility.RxUtils
import nya.kitsunyan.foxydroid.utility.Utils
import nya.kitsunyan.foxydroid.utility.extension.android.*
import nya.kitsunyan.foxydroid.utility.extension.resources.*
import nya.kitsunyan.foxydroid.widget.DividerItemDecoration
import nya.kitsunyan.foxydroid.widget.FocusSearchView
import nya.kitsunyan.foxydroid.widget.StableRecyclerAdapter
import com.michatec.store.R
import com.michatec.store.content.Preferences
import com.michatec.store.database.Database
import com.michatec.store.entity.ProductItem
import com.michatec.store.service.Connection
import com.michatec.store.service.SyncService
import com.michatec.store.utility.RxUtils
import com.michatec.store.utility.Utils
import com.michatec.store.utility.extension.android.*
import com.michatec.store.utility.extension.resources.*
import com.michatec.store.widget.DividerItemDecoration
import com.michatec.store.widget.FocusSearchView
import com.michatec.store.widget.StableRecyclerAdapter
import kotlin.math.*
class TabsFragment: ScreenFragment() {
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.service
package com.michatec.store.service
import android.content.ComponentName
import android.content.Context
@@ -1,9 +1,9 @@
package nya.kitsunyan.foxydroid.service
package com.michatec.store.service
import android.app.Service
import android.content.Intent
import android.os.IBinder
import nya.kitsunyan.foxydroid.utility.extension.android.*
import com.michatec.store.utility.extension.android.*
abstract class ConnectionService<T: IBinder>: Service() {
abstract override fun onBind(intent: Intent): T
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.service
package com.michatec.store.service
import android.app.NotificationChannel
import android.app.NotificationManager
@@ -13,18 +13,18 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.disposables.Disposable
import io.reactivex.rxjava3.subjects.PublishSubject
import nya.kitsunyan.foxydroid.BuildConfig
import nya.kitsunyan.foxydroid.Common
import nya.kitsunyan.foxydroid.MainActivity
import nya.kitsunyan.foxydroid.R
import nya.kitsunyan.foxydroid.content.Cache
import nya.kitsunyan.foxydroid.entity.Release
import nya.kitsunyan.foxydroid.entity.Repository
import nya.kitsunyan.foxydroid.network.Downloader
import nya.kitsunyan.foxydroid.utility.Utils
import nya.kitsunyan.foxydroid.utility.extension.android.*
import nya.kitsunyan.foxydroid.utility.extension.resources.*
import nya.kitsunyan.foxydroid.utility.extension.text.*
import com.michatec.store.BuildConfig
import com.michatec.store.Common
import com.michatec.store.MainActivity
import com.michatec.store.R
import com.michatec.store.content.Cache
import com.michatec.store.entity.Release
import com.michatec.store.entity.Repository
import com.michatec.store.network.Downloader
import com.michatec.store.utility.Utils
import com.michatec.store.utility.extension.android.*
import com.michatec.store.utility.extension.resources.*
import com.michatec.store.utility.extension.text.*
import java.io.File
import java.security.MessageDigest
import java.util.concurrent.TimeUnit
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.service
package com.michatec.store.service
import android.app.NotificationChannel
import android.app.NotificationManager
@@ -18,19 +18,19 @@ import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.disposables.Disposable
import io.reactivex.rxjava3.schedulers.Schedulers
import io.reactivex.rxjava3.subjects.PublishSubject
import nya.kitsunyan.foxydroid.BuildConfig
import nya.kitsunyan.foxydroid.Common
import nya.kitsunyan.foxydroid.MainActivity
import nya.kitsunyan.foxydroid.R
import nya.kitsunyan.foxydroid.content.Preferences
import nya.kitsunyan.foxydroid.database.Database
import nya.kitsunyan.foxydroid.entity.ProductItem
import nya.kitsunyan.foxydroid.entity.Repository
import nya.kitsunyan.foxydroid.index.RepositoryUpdater
import nya.kitsunyan.foxydroid.utility.RxUtils
import nya.kitsunyan.foxydroid.utility.extension.android.*
import nya.kitsunyan.foxydroid.utility.extension.resources.*
import nya.kitsunyan.foxydroid.utility.extension.text.*
import com.michatec.store.BuildConfig
import com.michatec.store.Common
import com.michatec.store.MainActivity
import com.michatec.store.R
import com.michatec.store.content.Preferences
import com.michatec.store.database.Database
import com.michatec.store.entity.ProductItem
import com.michatec.store.entity.Repository
import com.michatec.store.index.RepositoryUpdater
import com.michatec.store.utility.RxUtils
import com.michatec.store.utility.extension.android.*
import com.michatec.store.utility.extension.resources.*
import com.michatec.store.utility.extension.text.*
import java.lang.ref.WeakReference
import java.util.concurrent.TimeUnit
import kotlin.math.*
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.utility
package com.michatec.store.utility
import android.os.Parcel
import android.os.Parcelable
@@ -0,0 +1,109 @@
package com.michatec.store.utility
import android.content.Context
import android.content.pm.PackageItemInfo
import android.content.pm.PermissionInfo
import android.content.res.Resources
import java.util.Locale
object PackageItemResolver {
class LocalCache {
internal val resources = mutableMapOf<String, Resources>()
}
private data class CacheKey(val locales: List<Locale>, val packageName: String, val resId: Int)
private val cache = mutableMapOf<CacheKey, String?>()
private fun load(context: Context, localCache: LocalCache, packageName: String,
nonLocalized: CharSequence?, resId: Int): CharSequence? {
return when {
nonLocalized != null -> {
nonLocalized
}
resId != 0 -> {
val localesList = context.resources.configuration.locales
val locales = (0 until localesList.size()).map(localesList::get)
val cacheKey = CacheKey(locales, packageName, resId)
if (cache.containsKey(cacheKey)) {
cache[cacheKey]
} else {
val resources = localCache.resources[packageName] ?: run {
val resources = try {
context.createPackageContext(packageName, 0)
.createConfigurationContext(context.resources.configuration)
.resources
} catch (_: Exception) {
null
}
resources?.let { localCache.resources[packageName] = it }
resources
}
val label = resources?.getString(resId)
cache[cacheKey] = label
label
}
}
else -> {
null
}
}
}
fun loadLabel(context: Context, localCache: LocalCache, packageItemInfo: PackageItemInfo): CharSequence? {
return load(context, localCache, packageItemInfo.packageName,
packageItemInfo.nonLocalizedLabel, packageItemInfo.labelRes)
}
fun loadDescription(context: Context, localCache: LocalCache, permissionInfo: PermissionInfo): CharSequence? {
return load(context, localCache, permissionInfo.packageName,
permissionInfo.nonLocalizedDescription, permissionInfo.descriptionRes)
}
fun getPermissionGroup(permissionInfo: PermissionInfo): String? {
return when (permissionInfo.name) {
android.Manifest.permission.READ_CONTACTS,
android.Manifest.permission.WRITE_CONTACTS,
android.Manifest.permission.GET_ACCOUNTS ->
android.Manifest.permission_group.CONTACTS
android.Manifest.permission.READ_CALENDAR,
android.Manifest.permission.WRITE_CALENDAR ->
android.Manifest.permission_group.CALENDAR
android.Manifest.permission.SEND_SMS,
android.Manifest.permission.RECEIVE_SMS,
android.Manifest.permission.READ_SMS,
android.Manifest.permission.RECEIVE_MMS,
android.Manifest.permission.RECEIVE_WAP_PUSH,
"android.permission.READ_CELL_BROADCASTS" ->
android.Manifest.permission_group.SMS
android.Manifest.permission.READ_EXTERNAL_STORAGE,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
android.Manifest.permission.ACCESS_MEDIA_LOCATION ->
android.Manifest.permission_group.STORAGE
android.Manifest.permission.ACCESS_FINE_LOCATION,
android.Manifest.permission.ACCESS_COARSE_LOCATION,
android.Manifest.permission.ACCESS_BACKGROUND_LOCATION ->
android.Manifest.permission_group.LOCATION
android.Manifest.permission.READ_CALL_LOG,
android.Manifest.permission.WRITE_CALL_LOG,
android.Manifest.permission.READ_PHONE_STATE,
android.Manifest.permission.READ_PHONE_NUMBERS,
android.Manifest.permission.CALL_PHONE,
android.Manifest.permission.ADD_VOICEMAIL,
android.Manifest.permission.USE_SIP,
android.Manifest.permission.ANSWER_PHONE_CALLS,
android.Manifest.permission.ACCEPT_HANDOVER ->
android.Manifest.permission_group.PHONE
android.Manifest.permission.RECORD_AUDIO ->
android.Manifest.permission_group.MICROPHONE
android.Manifest.permission.ACTIVITY_RECOGNITION ->
android.Manifest.permission_group.ACTIVITY_RECOGNITION
android.Manifest.permission.CAMERA ->
android.Manifest.permission_group.CAMERA
android.Manifest.permission.BODY_SENSORS ->
android.Manifest.permission_group.SENSORS
else -> null
}
}
}
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.utility
package com.michatec.store.utility
import java.io.InputStream
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.utility
package com.michatec.store.utility
import android.os.CancellationSignal
import android.os.OperationCanceledException
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.utility
package com.michatec.store.utility
import android.animation.ValueAnimator
import android.annotation.SuppressLint
@@ -8,11 +8,11 @@ import android.content.res.Configuration
import android.graphics.drawable.Drawable
import android.os.LocaleList
import android.provider.Settings
import nya.kitsunyan.foxydroid.BuildConfig
import nya.kitsunyan.foxydroid.R
import nya.kitsunyan.foxydroid.utility.extension.android.*
import nya.kitsunyan.foxydroid.utility.extension.resources.*
import nya.kitsunyan.foxydroid.utility.extension.text.*
import com.michatec.store.BuildConfig
import com.michatec.store.R
import com.michatec.store.utility.extension.android.*
import com.michatec.store.utility.extension.resources.*
import com.michatec.store.utility.extension.text.*
import java.security.MessageDigest
import java.security.cert.Certificate
import java.security.cert.CertificateEncodingException
@@ -1,5 +1,5 @@
@file:Suppress("PackageDirectoryMismatch")
package nya.kitsunyan.foxydroid.utility.extension.android
package com.michatec.store.utility.extension.android
import android.app.NotificationManager
import android.content.Context
@@ -25,16 +25,15 @@ val Context.notificationManager: NotificationManager
get() = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val PackageInfo.versionCodeCompat: Long
get() = if (Android.sdk(28)) longVersionCode else @Suppress("DEPRECATION") versionCode.toLong()
get() = longVersionCode
val PackageInfo.singleSignature: Signature?
get() {
return if (Android.sdk(28)) {
val signingInfo = signingInfo
if (signingInfo?.hasMultipleSigners() == false) signingInfo.apkContentsSigners
?.let { if (it.size == 1) it[0] else null } else null
val signingInfo = signingInfo
return if (signingInfo?.hasMultipleSigners() == false) {
signingInfo.apkContentsSigners?.let { if (it.size == 1) it[0] else null }
} else {
null
null
}
}
@@ -56,18 +55,17 @@ object Android {
object PendingIntent {
val FLAG_IMMUTABLE: Int
get() = if (sdk(23)) android.app.PendingIntent.FLAG_IMMUTABLE else 0
get() = android.app.PendingIntent.FLAG_IMMUTABLE
}
object PackageManager {
val signaturesFlag: Int
get() = (if (sdk(28)) android.content.pm.PackageManager.GET_SIGNING_CERTIFICATES else 0)
get() = android.content.pm.PackageManager.GET_SIGNING_CERTIFICATES
}
object ServiceInfo {
val FOREGROUND_SERVICE_TYPE_DATA_SYNC: Int
get() = if (sdk(29)) android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC else 0
get() = android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC
}
object Device {
@@ -1,5 +1,5 @@
@file:Suppress("PackageDirectoryMismatch")
package nya.kitsunyan.foxydroid.utility.extension.json
package com.michatec.store.utility.extension.json
import com.fasterxml.jackson.core.JsonFactory
import com.fasterxml.jackson.core.JsonGenerator
@@ -1,5 +1,5 @@
@file:Suppress("PackageDirectoryMismatch")
package nya.kitsunyan.foxydroid.utility.extension.resources
package com.michatec.store.utility.extension.resources
import android.content.Context
import android.content.res.ColorStateList
@@ -18,7 +18,7 @@ import androidx.core.content.ContextCompat
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat
import com.squareup.picasso.Picasso
import com.squareup.picasso.RequestCreator
import nya.kitsunyan.foxydroid.utility.extension.android.*
import com.michatec.store.utility.extension.android.*
import org.xmlpull.v1.XmlPullParser
import kotlin.math.*
@@ -1,5 +1,5 @@
@file:Suppress("PackageDirectoryMismatch")
package nya.kitsunyan.foxydroid.utility.extension.text
package com.michatec.store.utility.extension.text
import android.util.Log
import java.util.Locale
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.widget
package com.michatec.store.widget
import android.text.Selection
import android.text.Spannable
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.widget
package com.michatec.store.widget
import android.annotation.SuppressLint
import android.database.Cursor
@@ -1,12 +1,12 @@
package nya.kitsunyan.foxydroid.widget
package com.michatec.store.widget
import android.content.Context
import android.graphics.Canvas
import android.graphics.Rect
import android.view.View
import androidx.recyclerview.widget.RecyclerView
import nya.kitsunyan.foxydroid.R
import nya.kitsunyan.foxydroid.utility.extension.resources.*
import com.michatec.store.R
import com.michatec.store.utility.extension.resources.*
import kotlin.math.*
class DividerItemDecoration(context: Context, private val configure: (context: Context,
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.widget
package com.michatec.store.widget
import android.util.SparseArray
import android.view.ViewGroup
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.widget
package com.michatec.store.widget
import android.content.Context
import android.util.AttributeSet
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.widget
package com.michatec.store.widget
import android.content.Context
import android.util.AttributeSet
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.widget
package com.michatec.store.widget
import android.graphics.Canvas
import android.graphics.Rect
@@ -7,7 +7,7 @@ import android.view.MotionEvent
import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import nya.kitsunyan.foxydroid.utility.extension.resources.*
import com.michatec.store.utility.extension.resources.*
import kotlin.math.*
class RecyclerFastScroller(private val recyclerView: RecyclerView) {
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.widget
package com.michatec.store.widget
import androidx.recyclerview.widget.RecyclerView
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.widget
package com.michatec.store.widget
import android.content.Context
import android.util.AttributeSet
@@ -1,122 +0,0 @@
package nya.kitsunyan.foxydroid.utility
import android.content.Context
import android.content.pm.PackageItemInfo
import android.content.pm.PermissionInfo
import android.content.res.Resources
import nya.kitsunyan.foxydroid.utility.extension.android.*
import java.util.Locale
object PackageItemResolver {
class LocalCache {
internal val resources = mutableMapOf<String, Resources>()
}
private data class CacheKey(val locales: List<Locale>, val packageName: String, val resId: Int)
private val cache = mutableMapOf<CacheKey, String?>()
private fun load(context: Context, localCache: LocalCache, packageName: String,
nonLocalized: CharSequence?, resId: Int): CharSequence? {
return when {
nonLocalized != null -> {
nonLocalized
}
resId != 0 -> {
val locales = if (Android.sdk(24)) {
val localesList = context.resources.configuration.locales
(0 until localesList.size()).map(localesList::get)
} else {
@Suppress("DEPRECATION")
listOf(context.resources.configuration.locale)
}
val cacheKey = CacheKey(locales, packageName, resId)
if (cache.containsKey(cacheKey)) {
cache[cacheKey]
} else {
val resources = localCache.resources[packageName] ?: run {
val resources = try {
val resources = context.packageManager.getResourcesForApplication(packageName)
@Suppress("DEPRECATION")
resources.updateConfiguration(context.resources.configuration, null)
resources
} catch (_: Exception) {
null
}
resources?.let { localCache.resources[packageName] = it }
resources
}
val label = resources?.getString(resId)
cache[cacheKey] = label
label
}
}
else -> {
null
}
}
}
fun loadLabel(context: Context, localCache: LocalCache, packageItemInfo: PackageItemInfo): CharSequence? {
return load(context, localCache, packageItemInfo.packageName,
packageItemInfo.nonLocalizedLabel, packageItemInfo.labelRes)
}
fun loadDescription(context: Context, localCache: LocalCache, permissionInfo: PermissionInfo): CharSequence? {
return load(context, localCache, permissionInfo.packageName,
permissionInfo.nonLocalizedDescription, permissionInfo.descriptionRes)
}
fun getPermissionGroup(permissionInfo: PermissionInfo): String? {
return if (Android.sdk(29)) {
// Copied from package installer (Utils.java)
when (permissionInfo.name) {
android.Manifest.permission.READ_CONTACTS,
android.Manifest.permission.WRITE_CONTACTS,
android.Manifest.permission.GET_ACCOUNTS ->
android.Manifest.permission_group.CONTACTS
android.Manifest.permission.READ_CALENDAR,
android.Manifest.permission.WRITE_CALENDAR ->
android.Manifest.permission_group.CALENDAR
android.Manifest.permission.SEND_SMS,
android.Manifest.permission.RECEIVE_SMS,
android.Manifest.permission.READ_SMS,
android.Manifest.permission.RECEIVE_MMS,
android.Manifest.permission.RECEIVE_WAP_PUSH,
"android.permission.READ_CELL_BROADCASTS" ->
android.Manifest.permission_group.SMS
android.Manifest.permission.READ_EXTERNAL_STORAGE,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
android.Manifest.permission.ACCESS_MEDIA_LOCATION ->
android.Manifest.permission_group.STORAGE
android.Manifest.permission.ACCESS_FINE_LOCATION,
android.Manifest.permission.ACCESS_COARSE_LOCATION,
android.Manifest.permission.ACCESS_BACKGROUND_LOCATION ->
android.Manifest.permission_group.LOCATION
android.Manifest.permission.READ_CALL_LOG,
android.Manifest.permission.WRITE_CALL_LOG,
@Suppress("DEPRECATION") android.Manifest.permission.PROCESS_OUTGOING_CALLS ->
android.Manifest.permission_group.CALL_LOG
android.Manifest.permission.READ_PHONE_STATE,
android.Manifest.permission.READ_PHONE_NUMBERS,
android.Manifest.permission.CALL_PHONE,
android.Manifest.permission.ADD_VOICEMAIL,
android.Manifest.permission.USE_SIP,
android.Manifest.permission.ANSWER_PHONE_CALLS,
android.Manifest.permission.ACCEPT_HANDOVER ->
android.Manifest.permission_group.PHONE
android.Manifest.permission.RECORD_AUDIO ->
android.Manifest.permission_group.MICROPHONE
android.Manifest.permission.ACTIVITY_RECOGNITION ->
android.Manifest.permission_group.ACTIVITY_RECOGNITION
android.Manifest.permission.CAMERA ->
android.Manifest.permission_group.CAMERA
android.Manifest.permission.BODY_SENSORS ->
android.Manifest.permission_group.SENSORS
else -> null
}
} else {
permissionInfo.group
}
}
}
+1 -1
View File
@@ -95,7 +95,7 @@
android:fontFamily="monospace"
android:textSize="16sp"
android:inputType="textNoSuggestions|textMultiLine"
tools:ignore="Autofill,LabelFor" />
tools:ignore="Autofill,LabelFor,Speakable" />
<TextView
android:id="@+id/fingerprint_error"
+3 -3
View File
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<nya.kitsunyan.foxydroid.widget.FragmentLinearLayout
<com.michatec.store.widget.FragmentLinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
@@ -13,7 +13,7 @@
android:background="?android:attr/colorPrimary"
android:elevation="4dp">
<nya.kitsunyan.foxydroid.widget.Toolbar
<com.michatec.store.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -33,4 +33,4 @@
android:layout_weight="1"
android:background="?android:attr/colorBackground" />
</nya.kitsunyan.foxydroid.widget.FragmentLinearLayout>
</com.michatec.store.widget.FragmentLinearLayout>
@@ -66,6 +66,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_gravity="bottom"
android:text="@string/website"
style="@android:style/Widget.Material.Button" />
</LinearLayout>
+1 -1
View File
@@ -15,7 +15,7 @@
<FrameLayout
android:id="@+id/section_layout"
android:layout_width="match_parent"
android:layout_height="0dp">
android:layout_height="wrap_content">
<LinearLayout
android:id="@+id/section_change"
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="always">Always</string>
<string name="anti_features">Anti-features</string>
<string name="application">Application</string>
<string name="application_name" translatable="false">Foxy Droid</string>
<string name="application_name" translatable="false">Store</string>
<string name="application_not_found">Application not found</string>
<string name="author_email">Author email</string>
<string name="author_website">Author website</string>