- 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' apply plugin: 'com.android.application'
android { android {
namespace 'nya.kitsunyan.foxydroid' namespace 'com.michatec.store'
compileSdk 36 compileSdk 36
defaultConfig { defaultConfig {
applicationId 'nya.kitsunyan.foxydroid' applicationId 'com.michatec.store'
minSdk 30 minSdk 30
targetSdk 36 targetSdk 36
versionCode 15 versionCode 15
+1 -1
View File
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists 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 zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
+4 -4
View File
@@ -4,18 +4,18 @@
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <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_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.REQUEST_DELETE_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.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
<queries> <queries>
<intent> <intent>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent> </intent>
<package android:name="com.android.vending" />
</queries> </queries>
<application <application
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid package com.michatec.store
object Common { object Common {
const val NOTIFICATION_CHANNEL_SYNCING = "syncing" const val NOTIFICATION_CHANNEL_SYNCING = "syncing"
@@ -1,7 +1,7 @@
package nya.kitsunyan.foxydroid package com.michatec.store
import android.content.Intent import android.content.Intent
import nya.kitsunyan.foxydroid.screen.ScreenActivity import com.michatec.store.screen.ScreenActivity
class MainActivity: ScreenActivity() { class MainActivity: ScreenActivity() {
companion object { companion object {
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid package com.michatec.store
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Application import android.app.Application
@@ -13,18 +13,18 @@ import android.content.pm.PackageInfo
import com.squareup.picasso.OkHttp3Downloader import com.squareup.picasso.OkHttp3Downloader
import com.squareup.picasso.Picasso import com.squareup.picasso.Picasso
import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.disposables.Disposable
import nya.kitsunyan.foxydroid.content.Cache import com.michatec.store.content.Cache
import nya.kitsunyan.foxydroid.content.Preferences import com.michatec.store.content.Preferences
import nya.kitsunyan.foxydroid.content.ProductPreferences import com.michatec.store.content.ProductPreferences
import nya.kitsunyan.foxydroid.database.Database import com.michatec.store.database.Database
import nya.kitsunyan.foxydroid.entity.InstalledItem import com.michatec.store.entity.InstalledItem
import nya.kitsunyan.foxydroid.index.RepositoryUpdater import com.michatec.store.index.RepositoryUpdater
import nya.kitsunyan.foxydroid.network.Downloader import com.michatec.store.network.Downloader
import nya.kitsunyan.foxydroid.network.PicassoDownloader import com.michatec.store.network.PicassoDownloader
import nya.kitsunyan.foxydroid.service.Connection import com.michatec.store.service.Connection
import nya.kitsunyan.foxydroid.service.SyncService import com.michatec.store.service.SyncService
import nya.kitsunyan.foxydroid.utility.Utils import com.michatec.store.utility.Utils
import nya.kitsunyan.foxydroid.utility.extension.android.* import com.michatec.store.utility.extension.android.*
import java.net.InetSocketAddress import java.net.InetSocketAddress
import java.net.Proxy import java.net.Proxy
@@ -61,6 +61,7 @@ class MainApplication: Application() {
updateSyncJob(false) updateSyncJob(false)
} }
@SuppressLint("QueryPermissionsNeeded")
private fun listenApplications() { private fun listenApplications() {
registerReceiver(object: BroadcastReceiver() { registerReceiver(object: BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) { 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.ContentProvider
import android.content.ContentValues import android.content.ContentValues
@@ -10,7 +10,7 @@ import android.net.Uri
import android.os.ParcelFileDescriptor import android.os.ParcelFileDescriptor
import android.provider.OpenableColumns import android.provider.OpenableColumns
import android.system.Os import android.system.Os
import nya.kitsunyan.foxydroid.utility.extension.android.* import com.michatec.store.utility.extension.android.*
import java.io.File import java.io.File
import java.util.UUID import java.util.UUID
import kotlin.concurrent.thread 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.Context
import android.content.SharedPreferences import android.content.SharedPreferences
import android.content.res.Configuration import android.content.res.Configuration
import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.subjects.PublishSubject import io.reactivex.rxjava3.subjects.PublishSubject
import nya.kitsunyan.foxydroid.R import com.michatec.store.R
import nya.kitsunyan.foxydroid.entity.ProductItem import com.michatec.store.entity.ProductItem
import nya.kitsunyan.foxydroid.utility.extension.android.* import com.michatec.store.utility.extension.android.*
import java.net.Proxy import java.net.Proxy
import androidx.core.content.edit 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.Context
import android.content.SharedPreferences import android.content.SharedPreferences
import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.disposables.Disposable
import io.reactivex.rxjava3.schedulers.Schedulers import io.reactivex.rxjava3.schedulers.Schedulers
import io.reactivex.rxjava3.subjects.PublishSubject import io.reactivex.rxjava3.subjects.PublishSubject
import nya.kitsunyan.foxydroid.database.Database import com.michatec.store.database.Database
import nya.kitsunyan.foxydroid.entity.ProductPreference import com.michatec.store.entity.ProductPreference
import nya.kitsunyan.foxydroid.utility.extension.json.* import com.michatec.store.utility.extension.json.*
import java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
import java.nio.charset.Charset
import androidx.core.content.edit import androidx.core.content.edit
object ProductPreferences { object ProductPreferences {
@@ -57,15 +56,14 @@ object ProductPreferences {
operator fun set(packageName: String, productPreference: ProductPreference) { operator fun set(packageName: String, productPreference: ProductPreference) {
val oldProductPreference = this[packageName] val oldProductPreference = this[packageName]
val json = ByteArrayOutputStream().apply {
Json.factory.createGenerator(this).use { it.writeDictionary(productPreference::serialize) }
}.toByteArray().toString(Charsets.UTF_8)
preferences.edit { preferences.edit {
putString( putString(packageName, json)
packageName, ByteArrayOutputStream()
.apply {
Json.factory.createGenerator(this)
.use { it.writeDictionary(productPreference::serialize) }
}
.toByteArray().toString(Charset.defaultCharset()))
} }
if (oldProductPreference.ignoreUpdates != productPreference.ignoreUpdates || if (oldProductPreference.ignoreUpdates != productPreference.ignoreUpdates ||
oldProductPreference.ignoreVersionCode != productPreference.ignoreVersionCode) { oldProductPreference.ignoreVersionCode != productPreference.ignoreVersionCode) {
subject.onNext(Pair(packageName, productPreference.databaseVersionCode)) 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.database.Cursor
import android.os.Bundle import android.os.Bundle
@@ -7,7 +7,7 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.loader.app.LoaderManager import androidx.loader.app.LoaderManager
import androidx.loader.content.Loader import androidx.loader.content.Loader
import nya.kitsunyan.foxydroid.entity.ProductItem import com.michatec.store.entity.ProductItem
class CursorOwner: Fragment(), LoaderManager.LoaderCallbacks<Cursor> { class CursorOwner: Fragment(), LoaderManager.LoaderCallbacks<Cursor> {
sealed class Request { sealed class Request {
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.database package com.michatec.store.database
import android.content.ContentValues import android.content.ContentValues
import android.content.Context import android.content.Context
@@ -9,12 +9,12 @@ import android.os.CancellationSignal
import com.fasterxml.jackson.core.JsonGenerator import com.fasterxml.jackson.core.JsonGenerator
import com.fasterxml.jackson.core.JsonParser import com.fasterxml.jackson.core.JsonParser
import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Observable
import nya.kitsunyan.foxydroid.entity.InstalledItem import com.michatec.store.entity.InstalledItem
import nya.kitsunyan.foxydroid.entity.Product import com.michatec.store.entity.Product
import nya.kitsunyan.foxydroid.entity.ProductItem import com.michatec.store.entity.ProductItem
import nya.kitsunyan.foxydroid.entity.Repository import com.michatec.store.entity.Repository
import nya.kitsunyan.foxydroid.utility.extension.android.* import com.michatec.store.utility.extension.android.*
import nya.kitsunyan.foxydroid.utility.extension.json.* import com.michatec.store.utility.extension.json.*
import java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
import androidx.core.database.sqlite.transaction 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 var created = false
private set private set
var updated = false var updated = false
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.database package com.michatec.store.database
import android.database.ContentObserver import android.database.ContentObserver
import android.database.Cursor 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.Cursor
import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteDatabase
import android.os.CancellationSignal import android.os.CancellationSignal
import nya.kitsunyan.foxydroid.BuildConfig import com.michatec.store.BuildConfig
import nya.kitsunyan.foxydroid.utility.extension.android.* import com.michatec.store.utility.extension.android.*
import nya.kitsunyan.foxydroid.utility.extension.text.* import com.michatec.store.utility.extension.text.*
class QueryBuilder { class QueryBuilder {
companion object { companion object {
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.database package com.michatec.store.database
import android.content.Context import android.content.Context
import android.database.Cursor 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) 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.JsonGenerator
import com.fasterxml.jackson.core.JsonParser import com.fasterxml.jackson.core.JsonParser
import com.fasterxml.jackson.core.JsonToken import com.fasterxml.jackson.core.JsonToken
import nya.kitsunyan.foxydroid.utility.extension.json.* import com.michatec.store.utility.extension.json.*
import nya.kitsunyan.foxydroid.utility.extension.text.* import com.michatec.store.utility.extension.text.*
data class Product(val repositoryId: Long, val packageName: String, val name: String, val summary: String, 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, 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 android.os.Parcel
import com.fasterxml.jackson.core.JsonGenerator import com.fasterxml.jackson.core.JsonGenerator
import com.fasterxml.jackson.core.JsonParser import com.fasterxml.jackson.core.JsonParser
import nya.kitsunyan.foxydroid.R import com.michatec.store.R
import nya.kitsunyan.foxydroid.utility.KParcelable import com.michatec.store.utility.KParcelable
import nya.kitsunyan.foxydroid.utility.extension.json.* import com.michatec.store.utility.extension.json.*
data class ProductItem(val repositoryId: Long, val packageName: String, val name: String, val summary: String, 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, 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.JsonGenerator
import com.fasterxml.jackson.core.JsonParser 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) { data class ProductPreference(val ignoreUpdates: Boolean, val ignoreVersionCode: Long) {
fun shouldIgnoreUpdate(versionCode: Long): Boolean { 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.JsonGenerator
import com.fasterxml.jackson.core.JsonParser import com.fasterxml.jackson.core.JsonParser
import com.fasterxml.jackson.core.JsonToken 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 import androidx.core.net.toUri
data class Release(val selected: Boolean, val version: String, val versionCode: Long, 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.JsonGenerator
import com.fasterxml.jackson.core.JsonParser import com.fasterxml.jackson.core.JsonParser
import nya.kitsunyan.foxydroid.utility.extension.json.* import com.michatec.store.utility.extension.json.*
data class Repository( data class Repository(
val id: Long, val address: String, val mirrors: List<String>, 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.content.res.ColorStateList
import android.graphics.Canvas 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.Rect
import android.graphics.drawable.Drawable 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 com.michatec.store.entity.Product
import nya.kitsunyan.foxydroid.entity.Release import com.michatec.store.entity.Release
import nya.kitsunyan.foxydroid.utility.extension.android.* import com.michatec.store.utility.extension.android.*
import org.xml.sax.Attributes import org.xml.sax.Attributes
import org.xml.sax.helpers.DefaultHandler import org.xml.sax.helpers.DefaultHandler
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
@@ -1,12 +1,12 @@
package nya.kitsunyan.foxydroid.index package com.michatec.store.index
import android.content.ContentValues import android.content.ContentValues
import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteDatabase
import com.fasterxml.jackson.core.JsonToken import com.fasterxml.jackson.core.JsonToken
import nya.kitsunyan.foxydroid.entity.Product import com.michatec.store.entity.Product
import nya.kitsunyan.foxydroid.entity.Release import com.michatec.store.entity.Release
import nya.kitsunyan.foxydroid.utility.extension.android.* import com.michatec.store.utility.extension.android.*
import nya.kitsunyan.foxydroid.utility.extension.json.* import com.michatec.store.utility.extension.json.*
import java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
import java.io.Closeable import java.io.Closeable
import java.io.File 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.JsonParser
import com.fasterxml.jackson.core.JsonToken import com.fasterxml.jackson.core.JsonToken
import nya.kitsunyan.foxydroid.entity.Product import com.michatec.store.entity.Product
import nya.kitsunyan.foxydroid.entity.Release import com.michatec.store.entity.Release
import nya.kitsunyan.foxydroid.utility.extension.android.* import com.michatec.store.utility.extension.android.*
import nya.kitsunyan.foxydroid.utility.extension.json.* import com.michatec.store.utility.extension.json.*
import nya.kitsunyan.foxydroid.utility.extension.text.* import com.michatec.store.utility.extension.text.*
import java.io.InputStream import java.io.InputStream
object IndexV1Parser { object IndexV1Parser {
@@ -1,21 +1,21 @@
package nya.kitsunyan.foxydroid.index package com.michatec.store.index
import android.content.Context import android.content.Context
import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.core.Single
import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.disposables.Disposable
import io.reactivex.rxjava3.schedulers.Schedulers import io.reactivex.rxjava3.schedulers.Schedulers
import nya.kitsunyan.foxydroid.content.Cache import com.michatec.store.content.Cache
import nya.kitsunyan.foxydroid.database.Database import com.michatec.store.database.Database
import nya.kitsunyan.foxydroid.entity.Product import com.michatec.store.entity.Product
import nya.kitsunyan.foxydroid.entity.Release import com.michatec.store.entity.Release
import nya.kitsunyan.foxydroid.entity.Repository import com.michatec.store.entity.Repository
import nya.kitsunyan.foxydroid.network.Downloader import com.michatec.store.network.Downloader
import nya.kitsunyan.foxydroid.utility.ProgressInputStream import com.michatec.store.utility.ProgressInputStream
import nya.kitsunyan.foxydroid.utility.RxUtils import com.michatec.store.utility.RxUtils
import nya.kitsunyan.foxydroid.utility.Utils import com.michatec.store.utility.Utils
import nya.kitsunyan.foxydroid.utility.extension.android.* import com.michatec.store.utility.extension.android.*
import nya.kitsunyan.foxydroid.utility.extension.text.* import com.michatec.store.utility.extension.text.*
import org.xml.sax.InputSource import org.xml.sax.InputSource
import java.io.File import java.io.File
import java.security.cert.X509Certificate 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.core.Single
import io.reactivex.rxjava3.schedulers.Schedulers import io.reactivex.rxjava3.schedulers.Schedulers
import nya.kitsunyan.foxydroid.utility.ProgressInputStream import com.michatec.store.utility.ProgressInputStream
import nya.kitsunyan.foxydroid.utility.RxUtils import com.michatec.store.utility.RxUtils
import okhttp3.Cache import okhttp3.Cache
import okhttp3.Call import okhttp3.Call
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
@@ -1,11 +1,11 @@
package nya.kitsunyan.foxydroid.network package com.michatec.store.network
import android.content.Context import android.content.Context
import android.net.Uri import android.net.Uri
import android.view.View import android.view.View
import nya.kitsunyan.foxydroid.entity.Product import com.michatec.store.entity.Product
import nya.kitsunyan.foxydroid.entity.Repository import com.michatec.store.entity.Repository
import nya.kitsunyan.foxydroid.utility.extension.text.* import com.michatec.store.utility.extension.text.*
import okhttp3.Cache import okhttp3.Cache
import okhttp3.Call import okhttp3.Call
import okhttp3.HttpUrl.Companion.toHttpUrl 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.app.AlertDialog
import android.content.ClipboardManager import android.content.ClipboardManager
@@ -24,16 +24,16 @@ import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.core.Single
import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.disposables.Disposable
import io.reactivex.rxjava3.schedulers.Schedulers import io.reactivex.rxjava3.schedulers.Schedulers
import nya.kitsunyan.foxydroid.R import com.michatec.store.R
import nya.kitsunyan.foxydroid.database.Database import com.michatec.store.database.Database
import nya.kitsunyan.foxydroid.entity.Repository import com.michatec.store.entity.Repository
import nya.kitsunyan.foxydroid.network.Downloader import com.michatec.store.network.Downloader
import nya.kitsunyan.foxydroid.service.Connection import com.michatec.store.service.Connection
import nya.kitsunyan.foxydroid.service.SyncService import com.michatec.store.service.SyncService
import nya.kitsunyan.foxydroid.utility.RxUtils import com.michatec.store.utility.RxUtils
import nya.kitsunyan.foxydroid.utility.Utils import com.michatec.store.utility.Utils
import nya.kitsunyan.foxydroid.utility.extension.resources.* import com.michatec.store.utility.extension.resources.*
import nya.kitsunyan.foxydroid.utility.extension.text.* import com.michatec.store.utility.extension.text.*
import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Request import okhttp3.Request
import java.net.URI import java.net.URI
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.screen package com.michatec.store.screen
import android.app.AlertDialog import android.app.AlertDialog
import android.content.ActivityNotFoundException import android.content.ActivityNotFoundException
@@ -9,12 +9,12 @@ import android.os.Parcel
import androidx.core.os.BundleCompat import androidx.core.os.BundleCompat
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentManager
import nya.kitsunyan.foxydroid.R import com.michatec.store.R
import nya.kitsunyan.foxydroid.entity.Release import com.michatec.store.entity.Release
import nya.kitsunyan.foxydroid.utility.KParcelable import com.michatec.store.utility.KParcelable
import nya.kitsunyan.foxydroid.utility.PackageItemResolver import com.michatec.store.utility.PackageItemResolver
import nya.kitsunyan.foxydroid.utility.extension.android.* import com.michatec.store.utility.extension.android.*
import nya.kitsunyan.foxydroid.utility.extension.text.* import com.michatec.store.utility.extension.text.*
import androidx.core.net.toUri import androidx.core.net.toUri
class MessageDialog(): DialogFragment() { class MessageDialog(): DialogFragment() {
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.screen package com.michatec.store.screen
import android.app.AlertDialog import android.app.AlertDialog
import android.app.Dialog import android.app.Dialog
@@ -20,9 +20,9 @@ import android.widget.Toolbar
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.disposables.Disposable
import nya.kitsunyan.foxydroid.R import com.michatec.store.R
import nya.kitsunyan.foxydroid.content.Preferences import com.michatec.store.content.Preferences
import nya.kitsunyan.foxydroid.utility.extension.resources.* import com.michatec.store.utility.extension.resources.*
import androidx.core.view.isNotEmpty import androidx.core.view.isNotEmpty
class PreferencesFragment: ScreenFragment() { class PreferencesFragment: ScreenFragment() {
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.screen package com.michatec.store.screen
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.ClipData import android.content.ClipData
@@ -40,25 +40,25 @@ import androidx.core.text.HtmlCompat
import androidx.core.text.util.LinkifyCompat import androidx.core.text.util.LinkifyCompat
import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import nya.kitsunyan.foxydroid.R import com.michatec.store.R
import nya.kitsunyan.foxydroid.content.Preferences import com.michatec.store.content.Preferences
import nya.kitsunyan.foxydroid.content.ProductPreferences import com.michatec.store.content.ProductPreferences
import nya.kitsunyan.foxydroid.entity.InstalledItem import com.michatec.store.entity.InstalledItem
import nya.kitsunyan.foxydroid.entity.Product import com.michatec.store.entity.Product
import nya.kitsunyan.foxydroid.entity.ProductPreference import com.michatec.store.entity.ProductPreference
import nya.kitsunyan.foxydroid.entity.Release import com.michatec.store.entity.Release
import nya.kitsunyan.foxydroid.entity.Repository import com.michatec.store.entity.Repository
import nya.kitsunyan.foxydroid.graphics.PaddingDrawable import com.michatec.store.graphics.PaddingDrawable
import nya.kitsunyan.foxydroid.network.PicassoDownloader import com.michatec.store.network.PicassoDownloader
import nya.kitsunyan.foxydroid.utility.KParcelable import com.michatec.store.utility.KParcelable
import nya.kitsunyan.foxydroid.utility.PackageItemResolver import com.michatec.store.utility.PackageItemResolver
import nya.kitsunyan.foxydroid.utility.Utils import com.michatec.store.utility.Utils
import nya.kitsunyan.foxydroid.utility.extension.android.* import com.michatec.store.utility.extension.android.*
import nya.kitsunyan.foxydroid.utility.extension.resources.* import com.michatec.store.utility.extension.resources.*
import nya.kitsunyan.foxydroid.utility.extension.text.* import com.michatec.store.utility.extension.text.*
import nya.kitsunyan.foxydroid.widget.ClickableMovementMethod import com.michatec.store.widget.ClickableMovementMethod
import nya.kitsunyan.foxydroid.widget.DividerItemDecoration import com.michatec.store.widget.DividerItemDecoration
import nya.kitsunyan.foxydroid.widget.StableRecyclerAdapter import com.michatec.store.widget.StableRecyclerAdapter
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
import java.util.Locale import java.util.Locale
import kotlin.math.* import kotlin.math.*
@@ -892,7 +892,7 @@ class ProductAdapter(private val callbacks: Callbacks, private val columns: Int)
} }
ProductPreferences[switchItem.packageName] = productPreference ProductPreferences[switchItem.packageName] = productPreference
items.asSequence().mapIndexedNotNull { index, item -> if (item is Item.HeaderItem || 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) callbacks.onPreferenceChanged(productPreference)
} }
} }
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.screen package com.michatec.store.screen
import android.app.AlertDialog import android.app.AlertDialog
import android.content.ActivityNotFoundException 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.core.Observable
import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.disposables.Disposable
import io.reactivex.rxjava3.schedulers.Schedulers import io.reactivex.rxjava3.schedulers.Schedulers
import nya.kitsunyan.foxydroid.R import com.michatec.store.R
import nya.kitsunyan.foxydroid.content.ProductPreferences import com.michatec.store.content.ProductPreferences
import nya.kitsunyan.foxydroid.database.Database import com.michatec.store.database.Database
import nya.kitsunyan.foxydroid.entity.InstalledItem import com.michatec.store.entity.InstalledItem
import nya.kitsunyan.foxydroid.entity.Product import com.michatec.store.entity.Product
import nya.kitsunyan.foxydroid.entity.ProductPreference import com.michatec.store.entity.ProductPreference
import nya.kitsunyan.foxydroid.entity.Release import com.michatec.store.entity.Release
import nya.kitsunyan.foxydroid.entity.Repository import com.michatec.store.entity.Repository
import nya.kitsunyan.foxydroid.service.Connection import com.michatec.store.service.Connection
import nya.kitsunyan.foxydroid.service.DownloadService import com.michatec.store.service.DownloadService
import nya.kitsunyan.foxydroid.utility.RxUtils import com.michatec.store.utility.RxUtils
import nya.kitsunyan.foxydroid.utility.Utils import com.michatec.store.utility.Utils
import nya.kitsunyan.foxydroid.utility.extension.android.* import com.michatec.store.utility.extension.android.*
import nya.kitsunyan.foxydroid.widget.DividerItemDecoration import com.michatec.store.widget.DividerItemDecoration
import androidx.core.net.toUri import androidx.core.net.toUri
class ProductFragment(): ScreenFragment(), ProductAdapter.Callbacks { class ProductFragment(): ScreenFragment(), ProductAdapter.Callbacks {
@@ -271,8 +271,8 @@ class ProductFragment(): ScreenFragment(), ProductAdapter.Callbacks {
val toolbar = toolbar val toolbar = toolbar
if (toolbar != null) { if (toolbar != null) {
for (action in sequenceOf(Action.INSTALL, Action.UPDATE, Action.UNINSTALL)) { for (action in sequenceOf(Action.INSTALL, Action.UPDATE, Action.UNINSTALL)) {
toolbar.menu.findItem(action.id).isEnabled = !downloading toolbar.menu.findItem(action.id).isEnabled = !downloading
} }
} }
this.actions = Pair(actions, primaryAction) this.actions = Pair(actions, primaryAction)
@@ -349,7 +349,6 @@ class ProductFragment(): ScreenFragment(), ProductAdapter.Callbacks {
if (productRepository != null && release != null && binder != null) { if (productRepository != null && release != null && binder != null) {
binder.enqueue(packageName, productRepository.first.name, productRepository.second, release) binder.enqueue(packageName, productRepository.first.name, productRepository.second, release)
} }
Unit
} }
ProductAdapter.Action.LAUNCH -> { ProductAdapter.Action.LAUNCH -> {
val launcherActivities = installed?.launcherActivities.orEmpty() val launcherActivities = installed?.launcherActivities.orEmpty()
@@ -358,7 +357,6 @@ class ProductFragment(): ScreenFragment(), ProductAdapter.Callbacks {
} else { } else {
launcherActivities.firstOrNull()?.let { startLauncherActivity(it.first) } launcherActivities.firstOrNull()?.let { startLauncherActivity(it.first) }
} }
Unit
} }
ProductAdapter.Action.DETAILS -> { ProductAdapter.Action.DETAILS -> {
startActivity(Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) startActivity(Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
@@ -373,9 +371,8 @@ class ProductFragment(): ScreenFragment(), ProductAdapter.Callbacks {
if (downloading && binder != null) { if (downloading && binder != null) {
binder.cancel(packageName) binder.cancel(packageName)
} }
Unit
} }
}::class }
} }
private fun startLauncherActivity(name: String) { 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.annotation.SuppressLint
import android.content.Context import android.content.Context
@@ -13,16 +13,16 @@ import android.widget.ImageView
import android.widget.ProgressBar import android.widget.ProgressBar
import android.widget.TextView import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import nya.kitsunyan.foxydroid.R import com.michatec.store.R
import nya.kitsunyan.foxydroid.database.Database import com.michatec.store.database.Database
import nya.kitsunyan.foxydroid.entity.ProductItem import com.michatec.store.entity.ProductItem
import nya.kitsunyan.foxydroid.entity.Repository import com.michatec.store.entity.Repository
import nya.kitsunyan.foxydroid.network.PicassoDownloader import com.michatec.store.network.PicassoDownloader
import nya.kitsunyan.foxydroid.utility.Utils import com.michatec.store.utility.Utils
import nya.kitsunyan.foxydroid.utility.extension.resources.* import com.michatec.store.utility.extension.resources.*
import nya.kitsunyan.foxydroid.utility.extension.text.* import com.michatec.store.utility.extension.text.*
import nya.kitsunyan.foxydroid.widget.CursorRecyclerAdapter import com.michatec.store.widget.CursorRecyclerAdapter
import nya.kitsunyan.foxydroid.widget.DividerItemDecoration import com.michatec.store.widget.DividerItemDecoration
class ProductsAdapter(private val onClick: (ProductItem) -> Unit): class ProductsAdapter(private val onClick: (ProductItem) -> Unit):
CursorRecyclerAdapter<ProductsAdapter.ViewType, RecyclerView.ViewHolder>() { 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.database.Cursor
import android.os.Bundle 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.core.Observable
import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.disposables.Disposable
import io.reactivex.rxjava3.schedulers.Schedulers import io.reactivex.rxjava3.schedulers.Schedulers
import nya.kitsunyan.foxydroid.R import com.michatec.store.R
import nya.kitsunyan.foxydroid.database.CursorOwner import com.michatec.store.database.CursorOwner
import nya.kitsunyan.foxydroid.database.Database import com.michatec.store.database.Database
import nya.kitsunyan.foxydroid.entity.ProductItem import com.michatec.store.entity.ProductItem
import nya.kitsunyan.foxydroid.utility.RxUtils import com.michatec.store.utility.RxUtils
import nya.kitsunyan.foxydroid.widget.DividerItemDecoration import com.michatec.store.widget.DividerItemDecoration
import nya.kitsunyan.foxydroid.widget.RecyclerFastScroller import com.michatec.store.widget.RecyclerFastScroller
class ProductsFragment(): ScreenFragment(), CursorOwner.Callback { class ProductsFragment(): ScreenFragment(), CursorOwner.Callback {
companion object { companion object {
@@ -1,15 +1,15 @@
package nya.kitsunyan.foxydroid.screen package com.michatec.store.screen
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Switch import android.widget.Switch
import android.widget.TextView import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import nya.kitsunyan.foxydroid.R import com.michatec.store.R
import nya.kitsunyan.foxydroid.database.Database import com.michatec.store.database.Database
import nya.kitsunyan.foxydroid.entity.Repository import com.michatec.store.entity.Repository
import nya.kitsunyan.foxydroid.utility.extension.resources.* import com.michatec.store.utility.extension.resources.*
import nya.kitsunyan.foxydroid.widget.CursorRecyclerAdapter import com.michatec.store.widget.CursorRecyclerAdapter
class RepositoriesAdapter(private val onClick: (Repository) -> Unit, class RepositoriesAdapter(private val onClick: (Repository) -> Unit,
private val onSwitch: (repository: Repository, isEnabled: Boolean) -> Boolean): 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.database.Cursor
import android.os.Bundle import android.os.Bundle
@@ -10,11 +10,11 @@ import android.widget.FrameLayout
import android.widget.Toolbar import android.widget.Toolbar
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import nya.kitsunyan.foxydroid.R import com.michatec.store.R
import nya.kitsunyan.foxydroid.database.CursorOwner import com.michatec.store.database.CursorOwner
import nya.kitsunyan.foxydroid.service.Connection import com.michatec.store.service.Connection
import nya.kitsunyan.foxydroid.service.SyncService import com.michatec.store.service.SyncService
import nya.kitsunyan.foxydroid.utility.Utils import com.michatec.store.utility.Utils
class RepositoriesFragment: ScreenFragment(), CursorOwner.Callback { class RepositoriesFragment: ScreenFragment(), CursorOwner.Callback {
private var recyclerView: RecyclerView? = null 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.os.Bundle
import android.text.SpannableStringBuilder import android.text.SpannableStringBuilder
@@ -17,12 +17,12 @@ import android.widget.Toolbar
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.disposables.Disposable
import nya.kitsunyan.foxydroid.R import com.michatec.store.R
import nya.kitsunyan.foxydroid.database.Database import com.michatec.store.database.Database
import nya.kitsunyan.foxydroid.service.Connection import com.michatec.store.service.Connection
import nya.kitsunyan.foxydroid.service.SyncService import com.michatec.store.service.SyncService
import nya.kitsunyan.foxydroid.utility.Utils import com.michatec.store.utility.Utils
import nya.kitsunyan.foxydroid.utility.extension.resources.* import com.michatec.store.utility.extension.resources.*
import java.util.Date import java.util.Date
import java.util.Locale 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.Context
import android.content.Intent import android.content.Intent
@@ -14,15 +14,15 @@ import androidx.core.os.BundleCompat
import androidx.core.view.WindowCompat import androidx.core.view.WindowCompat
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import nya.kitsunyan.foxydroid.R import com.michatec.store.R
import nya.kitsunyan.foxydroid.content.Cache import com.michatec.store.content.Cache
import nya.kitsunyan.foxydroid.content.Preferences import com.michatec.store.content.Preferences
import nya.kitsunyan.foxydroid.database.CursorOwner import com.michatec.store.database.CursorOwner
import nya.kitsunyan.foxydroid.utility.KParcelable import com.michatec.store.utility.KParcelable
import nya.kitsunyan.foxydroid.utility.Utils import com.michatec.store.utility.Utils
import nya.kitsunyan.foxydroid.utility.extension.android.* import com.michatec.store.utility.extension.android.*
import nya.kitsunyan.foxydroid.utility.extension.resources.* import com.michatec.store.utility.extension.resources.*
import nya.kitsunyan.foxydroid.utility.extension.text.* import com.michatec.store.utility.extension.text.*
abstract class ScreenActivity: FragmentActivity() { abstract class ScreenActivity: FragmentActivity() {
companion object { companion object {
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.screen package com.michatec.store.screen
import androidx.fragment.app.Fragment 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.app.Dialog
import android.content.Context 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.core.Observable
import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.disposables.Disposable
import io.reactivex.rxjava3.schedulers.Schedulers import io.reactivex.rxjava3.schedulers.Schedulers
import nya.kitsunyan.foxydroid.R import com.michatec.store.R
import nya.kitsunyan.foxydroid.database.Database import com.michatec.store.database.Database
import nya.kitsunyan.foxydroid.entity.Product import com.michatec.store.entity.Product
import nya.kitsunyan.foxydroid.entity.Repository import com.michatec.store.entity.Repository
import nya.kitsunyan.foxydroid.graphics.PaddingDrawable import com.michatec.store.graphics.PaddingDrawable
import nya.kitsunyan.foxydroid.network.PicassoDownloader import com.michatec.store.network.PicassoDownloader
import nya.kitsunyan.foxydroid.utility.RxUtils import com.michatec.store.utility.RxUtils
import nya.kitsunyan.foxydroid.utility.extension.android.* import com.michatec.store.utility.extension.android.*
import nya.kitsunyan.foxydroid.utility.extension.resources.* import com.michatec.store.utility.extension.resources.*
import nya.kitsunyan.foxydroid.widget.StableRecyclerAdapter import com.michatec.store.widget.StableRecyclerAdapter
class ScreenshotsFragment(): DialogFragment() { class ScreenshotsFragment(): DialogFragment() {
companion object { companion object {
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.screen package com.michatec.store.screen
import android.animation.ValueAnimator import android.animation.ValueAnimator
import android.content.Context 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.core.Observable
import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.disposables.Disposable
import io.reactivex.rxjava3.schedulers.Schedulers import io.reactivex.rxjava3.schedulers.Schedulers
import nya.kitsunyan.foxydroid.R import com.michatec.store.R
import nya.kitsunyan.foxydroid.content.Preferences import com.michatec.store.content.Preferences
import nya.kitsunyan.foxydroid.database.Database import com.michatec.store.database.Database
import nya.kitsunyan.foxydroid.entity.ProductItem import com.michatec.store.entity.ProductItem
import nya.kitsunyan.foxydroid.service.Connection import com.michatec.store.service.Connection
import nya.kitsunyan.foxydroid.service.SyncService import com.michatec.store.service.SyncService
import nya.kitsunyan.foxydroid.utility.RxUtils import com.michatec.store.utility.RxUtils
import nya.kitsunyan.foxydroid.utility.Utils import com.michatec.store.utility.Utils
import nya.kitsunyan.foxydroid.utility.extension.android.* import com.michatec.store.utility.extension.android.*
import nya.kitsunyan.foxydroid.utility.extension.resources.* import com.michatec.store.utility.extension.resources.*
import nya.kitsunyan.foxydroid.widget.DividerItemDecoration import com.michatec.store.widget.DividerItemDecoration
import nya.kitsunyan.foxydroid.widget.FocusSearchView import com.michatec.store.widget.FocusSearchView
import nya.kitsunyan.foxydroid.widget.StableRecyclerAdapter import com.michatec.store.widget.StableRecyclerAdapter
import kotlin.math.* import kotlin.math.*
class TabsFragment: ScreenFragment() { class TabsFragment: ScreenFragment() {
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.service package com.michatec.store.service
import android.content.ComponentName import android.content.ComponentName
import android.content.Context import android.content.Context
@@ -1,9 +1,9 @@
package nya.kitsunyan.foxydroid.service package com.michatec.store.service
import android.app.Service import android.app.Service
import android.content.Intent import android.content.Intent
import android.os.IBinder 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 class ConnectionService<T: IBinder>: Service() {
abstract override fun onBind(intent: Intent): T 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.NotificationChannel
import android.app.NotificationManager 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.core.Observable
import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.disposables.Disposable
import io.reactivex.rxjava3.subjects.PublishSubject import io.reactivex.rxjava3.subjects.PublishSubject
import nya.kitsunyan.foxydroid.BuildConfig import com.michatec.store.BuildConfig
import nya.kitsunyan.foxydroid.Common import com.michatec.store.Common
import nya.kitsunyan.foxydroid.MainActivity import com.michatec.store.MainActivity
import nya.kitsunyan.foxydroid.R import com.michatec.store.R
import nya.kitsunyan.foxydroid.content.Cache import com.michatec.store.content.Cache
import nya.kitsunyan.foxydroid.entity.Release import com.michatec.store.entity.Release
import nya.kitsunyan.foxydroid.entity.Repository import com.michatec.store.entity.Repository
import nya.kitsunyan.foxydroid.network.Downloader import com.michatec.store.network.Downloader
import nya.kitsunyan.foxydroid.utility.Utils import com.michatec.store.utility.Utils
import nya.kitsunyan.foxydroid.utility.extension.android.* import com.michatec.store.utility.extension.android.*
import nya.kitsunyan.foxydroid.utility.extension.resources.* import com.michatec.store.utility.extension.resources.*
import nya.kitsunyan.foxydroid.utility.extension.text.* import com.michatec.store.utility.extension.text.*
import java.io.File import java.io.File
import java.security.MessageDigest import java.security.MessageDigest
import java.util.concurrent.TimeUnit 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.NotificationChannel
import android.app.NotificationManager import android.app.NotificationManager
@@ -18,19 +18,19 @@ import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.disposables.Disposable
import io.reactivex.rxjava3.schedulers.Schedulers import io.reactivex.rxjava3.schedulers.Schedulers
import io.reactivex.rxjava3.subjects.PublishSubject import io.reactivex.rxjava3.subjects.PublishSubject
import nya.kitsunyan.foxydroid.BuildConfig import com.michatec.store.BuildConfig
import nya.kitsunyan.foxydroid.Common import com.michatec.store.Common
import nya.kitsunyan.foxydroid.MainActivity import com.michatec.store.MainActivity
import nya.kitsunyan.foxydroid.R import com.michatec.store.R
import nya.kitsunyan.foxydroid.content.Preferences import com.michatec.store.content.Preferences
import nya.kitsunyan.foxydroid.database.Database import com.michatec.store.database.Database
import nya.kitsunyan.foxydroid.entity.ProductItem import com.michatec.store.entity.ProductItem
import nya.kitsunyan.foxydroid.entity.Repository import com.michatec.store.entity.Repository
import nya.kitsunyan.foxydroid.index.RepositoryUpdater import com.michatec.store.index.RepositoryUpdater
import nya.kitsunyan.foxydroid.utility.RxUtils import com.michatec.store.utility.RxUtils
import nya.kitsunyan.foxydroid.utility.extension.android.* import com.michatec.store.utility.extension.android.*
import nya.kitsunyan.foxydroid.utility.extension.resources.* import com.michatec.store.utility.extension.resources.*
import nya.kitsunyan.foxydroid.utility.extension.text.* import com.michatec.store.utility.extension.text.*
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
import kotlin.math.* import kotlin.math.*
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.utility package com.michatec.store.utility
import android.os.Parcel import android.os.Parcel
import android.os.Parcelable 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 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.CancellationSignal
import android.os.OperationCanceledException import android.os.OperationCanceledException
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.utility package com.michatec.store.utility
import android.animation.ValueAnimator import android.animation.ValueAnimator
import android.annotation.SuppressLint import android.annotation.SuppressLint
@@ -8,11 +8,11 @@ import android.content.res.Configuration
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.os.LocaleList import android.os.LocaleList
import android.provider.Settings import android.provider.Settings
import nya.kitsunyan.foxydroid.BuildConfig import com.michatec.store.BuildConfig
import nya.kitsunyan.foxydroid.R import com.michatec.store.R
import nya.kitsunyan.foxydroid.utility.extension.android.* import com.michatec.store.utility.extension.android.*
import nya.kitsunyan.foxydroid.utility.extension.resources.* import com.michatec.store.utility.extension.resources.*
import nya.kitsunyan.foxydroid.utility.extension.text.* import com.michatec.store.utility.extension.text.*
import java.security.MessageDigest import java.security.MessageDigest
import java.security.cert.Certificate import java.security.cert.Certificate
import java.security.cert.CertificateEncodingException import java.security.cert.CertificateEncodingException
@@ -1,5 +1,5 @@
@file:Suppress("PackageDirectoryMismatch") @file:Suppress("PackageDirectoryMismatch")
package nya.kitsunyan.foxydroid.utility.extension.android package com.michatec.store.utility.extension.android
import android.app.NotificationManager import android.app.NotificationManager
import android.content.Context import android.content.Context
@@ -25,16 +25,15 @@ val Context.notificationManager: NotificationManager
get() = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager get() = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val PackageInfo.versionCodeCompat: Long val PackageInfo.versionCodeCompat: Long
get() = if (Android.sdk(28)) longVersionCode else @Suppress("DEPRECATION") versionCode.toLong() get() = longVersionCode
val PackageInfo.singleSignature: Signature? val PackageInfo.singleSignature: Signature?
get() { get() {
return if (Android.sdk(28)) { val signingInfo = signingInfo
val signingInfo = signingInfo return if (signingInfo?.hasMultipleSigners() == false) {
if (signingInfo?.hasMultipleSigners() == false) signingInfo.apkContentsSigners signingInfo.apkContentsSigners?.let { if (it.size == 1) it[0] else null }
?.let { if (it.size == 1) it[0] else null } else null
} else { } else {
null null
} }
} }
@@ -56,18 +55,17 @@ object Android {
object PendingIntent { object PendingIntent {
val FLAG_IMMUTABLE: Int val FLAG_IMMUTABLE: Int
get() = if (sdk(23)) android.app.PendingIntent.FLAG_IMMUTABLE else 0 get() = android.app.PendingIntent.FLAG_IMMUTABLE
} }
object PackageManager { object PackageManager {
val signaturesFlag: Int 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 { object ServiceInfo {
val FOREGROUND_SERVICE_TYPE_DATA_SYNC: Int 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 { object Device {
@@ -1,5 +1,5 @@
@file:Suppress("PackageDirectoryMismatch") @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.JsonFactory
import com.fasterxml.jackson.core.JsonGenerator import com.fasterxml.jackson.core.JsonGenerator
@@ -1,5 +1,5 @@
@file:Suppress("PackageDirectoryMismatch") @file:Suppress("PackageDirectoryMismatch")
package nya.kitsunyan.foxydroid.utility.extension.resources package com.michatec.store.utility.extension.resources
import android.content.Context import android.content.Context
import android.content.res.ColorStateList import android.content.res.ColorStateList
@@ -18,7 +18,7 @@ import androidx.core.content.ContextCompat
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat
import com.squareup.picasso.Picasso import com.squareup.picasso.Picasso
import com.squareup.picasso.RequestCreator 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 org.xmlpull.v1.XmlPullParser
import kotlin.math.* import kotlin.math.*
@@ -1,5 +1,5 @@
@file:Suppress("PackageDirectoryMismatch") @file:Suppress("PackageDirectoryMismatch")
package nya.kitsunyan.foxydroid.utility.extension.text package com.michatec.store.utility.extension.text
import android.util.Log import android.util.Log
import java.util.Locale 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.Selection
import android.text.Spannable import android.text.Spannable
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.widget package com.michatec.store.widget
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.database.Cursor import android.database.Cursor
@@ -1,12 +1,12 @@
package nya.kitsunyan.foxydroid.widget package com.michatec.store.widget
import android.content.Context import android.content.Context
import android.graphics.Canvas import android.graphics.Canvas
import android.graphics.Rect import android.graphics.Rect
import android.view.View import android.view.View
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import nya.kitsunyan.foxydroid.R import com.michatec.store.R
import nya.kitsunyan.foxydroid.utility.extension.resources.* import com.michatec.store.utility.extension.resources.*
import kotlin.math.* import kotlin.math.*
class DividerItemDecoration(context: Context, private val configure: (context: Context, 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.util.SparseArray
import android.view.ViewGroup import android.view.ViewGroup
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.widget package com.michatec.store.widget
import android.content.Context import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
@@ -1,4 +1,4 @@
package nya.kitsunyan.foxydroid.widget package com.michatec.store.widget
import android.content.Context import android.content.Context
import android.util.AttributeSet 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.Canvas
import android.graphics.Rect import android.graphics.Rect
@@ -7,7 +7,7 @@ import android.view.MotionEvent
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import nya.kitsunyan.foxydroid.utility.extension.resources.* import com.michatec.store.utility.extension.resources.*
import kotlin.math.* import kotlin.math.*
class RecyclerFastScroller(private val recyclerView: RecyclerView) { 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 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.content.Context
import android.util.AttributeSet 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:fontFamily="monospace"
android:textSize="16sp" android:textSize="16sp"
android:inputType="textNoSuggestions|textMultiLine" android:inputType="textNoSuggestions|textMultiLine"
tools:ignore="Autofill,LabelFor" /> tools:ignore="Autofill,LabelFor,Speakable" />
<TextView <TextView
android:id="@+id/fingerprint_error" android:id="@+id/fingerprint_error"
+3 -3
View File
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?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" xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
@@ -13,7 +13,7 @@
android:background="?android:attr/colorPrimary" android:background="?android:attr/colorPrimary"
android:elevation="4dp"> android:elevation="4dp">
<nya.kitsunyan.foxydroid.widget.Toolbar <com.michatec.store.widget.Toolbar
android:id="@+id/toolbar" android:id="@+id/toolbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@@ -33,4 +33,4 @@
android:layout_weight="1" android:layout_weight="1"
android:background="?android:attr/colorBackground" /> 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_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:layout_gravity="bottom" android:layout_gravity="bottom"
android:text="@string/website"
style="@android:style/Widget.Material.Button" /> style="@android:style/Widget.Material.Button" />
</LinearLayout> </LinearLayout>
+1 -1
View File
@@ -15,7 +15,7 @@
<FrameLayout <FrameLayout
android:id="@+id/section_layout" android:id="@+id/section_layout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp"> android:layout_height="wrap_content">
<LinearLayout <LinearLayout
android:id="@+id/section_change" android:id="@+id/section_change"
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="always">Always</string> <string name="always">Always</string>
<string name="anti_features">Anti-features</string> <string name="anti_features">Anti-features</string>
<string name="application">Application</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="application_not_found">Application not found</string>
<string name="author_email">Author email</string> <string name="author_email">Author email</string>
<string name="author_website">Author website</string> <string name="author_website">Author website</string>