diff --git a/app/build.gradle b/app/build.gradle
index 53c170180f673bc0f2ba856ffa05d1e87d110489..f9a2034a7536a0659d23bc0d7075894203e13632 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -21,6 +21,7 @@ android {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
+
}
dataBinding {
enabled = true
@@ -36,10 +37,6 @@ android {
androidExtensions {
experimental = true
}
- aaptOptions{
- additionalParameters '-I', 'app/e-ui-sdk.jar'
- }
-
}
dependencies {
@@ -87,7 +84,7 @@ dependencies {
implementation "com.fasterxml.jackson.core:jackson-databind:2.11.1"
implementation "com.fasterxml.jackson.module:jackson-module-kotlin:2.11.1"
- implementation 'com.github.chrisbanes:PhotoView:2.3.0'
+ implementation 'com.android.volley:volley:1.1.1'
- compileOnly files("e-ui-sdk.jar")
+ implementation 'com.github.chrisbanes:PhotoView:2.3.0'
}
diff --git a/app/e-ui-sdk.jar b/app/e-ui-sdk.jar
deleted file mode 100644
index 222953d20421211ecc08ca2e2f16e735263d2f58..0000000000000000000000000000000000000000
Binary files a/app/e-ui-sdk.jar and /dev/null differ
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 52792486bd659de9ed33bdffb53225e112a76f0d..a594b2ab7ea9ffac50136111fca307177c8bfeba 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -16,19 +16,19 @@
-
+
-
+
@@ -40,7 +40,6 @@
-
+ android:theme="@style/AppTheme1"
+ android:windowSoftInputMode="adjustResize" />
\ No newline at end of file
diff --git a/app/src/main/java/foundation/e/apps/MainActivity.kt b/app/src/main/java/foundation/e/apps/MainActivity.kt
index 92ae33b26b735c9a7bbda2be6434137b165a972e..baa457bed6519fe93d82291f321c98f4e9c24568 100644
--- a/app/src/main/java/foundation/e/apps/MainActivity.kt
+++ b/app/src/main/java/foundation/e/apps/MainActivity.kt
@@ -19,24 +19,15 @@ package foundation.e.apps
//import androidx.fragment.app.ListFragment
-
import android.annotation.SuppressLint
import android.content.*
import android.content.pm.PackageManager
-import android.content.res.ColorStateList
-import android.graphics.Color
import android.os.Bundle
import android.os.Handler
import android.preference.PreferenceManager
-import android.util.TypedValue
import android.view.MenuItem
import android.widget.Toast
-import androidx.annotation.ColorInt
-import androidx.annotation.ColorRes
import androidx.appcompat.app.AppCompatActivity
-import androidx.appcompat.view.ContextThemeWrapper
-import androidx.core.content.ContextCompat
-import androidx.core.graphics.drawable.DrawableCompat
import androidx.fragment.app.Fragment
import com.google.android.material.bottomnavigation.BottomNavigationItemView
import com.google.android.material.bottomnavigation.BottomNavigationMenuView
@@ -69,26 +60,22 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS
private val codeRequestPermissions = 9527
var doubleBackToExitPressedOnce = false;
private var isReceiverRegistered = false
- var accentColorOS = 0
+
companion object {
lateinit var mActivity: MainActivity
var sharedPreferences : SharedPreferences?=null
-
+ val sharedPrefFile = "kotlinsharedpreference"
}
-
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- //ThemeColors(this);
setContentView(R.layout.activity_main)
mActivity = this
disableCategoryIfOpenSource()
-
-
bottom_navigation_view.setOnNavigationItemSelectedListener{
if (selectFragment(it.itemId,it)) {
disableCategoryIfOpenSource()
@@ -115,28 +102,6 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS
}
setupLangReceiver()
applicationManagerServiceConnection.bindService(this)
-
- getAccentColor();
- bottom_navigation_view_color()
- }
-
- private fun bottom_navigation_view_color() {
- val iconsColorStates =
- ColorStateList(arrayOf(intArrayOf(-android.R.attr.state_checked),
- intArrayOf(android.R.attr.state_checked)), intArrayOf(
- Color.parseColor("#C4CFD9"),
- accentColorOS
- ))
-
- val textColorStates = ColorStateList(arrayOf(intArrayOf(-android.R.attr.state_checked), intArrayOf(android.R.attr.state_checked)), intArrayOf(
- Color.parseColor("#C4CFD9"),
- accentColorOS
-
- ))
-
- bottom_navigation_view.setItemIconTintList(iconsColorStates)
- bottom_navigation_view.setItemTextColor(textColorStates)
-
}
private fun initialiseUpdatesWorker() {
@@ -151,9 +116,9 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS
}
private fun initialiseFragments(applicationManager: ApplicationManager) {
- homeFragment.initialise(applicationManager, accentColorOS)
- searchFragment.initialise(applicationManager, accentColorOS)
- updatesFragment.initialise(applicationManager, accentColorOS)
+ homeFragment.initialise(applicationManager)
+ searchFragment.initialise(applicationManager)
+ updatesFragment.initialise(applicationManager)
}
override fun onNavigationItemSelected(item: MenuItem): Boolean {
@@ -179,28 +144,17 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS
return "any"
}
- fun tintMenuIcon(context: Context, item: MenuItem, @ColorRes color: Int) {
- val normalDrawable = item.icon
- val wrapDrawable = DrawableCompat.wrap(normalDrawable)
-
- DrawableCompat.setTint(wrapDrawable, ContextCompat.getColor(context, color))//context.resources.getColor(color))
- item.icon = wrapDrawable
- }
private fun selectFragment(fragmentId: Int, item: MenuItem?): Boolean {
-
when (fragmentId) {
-
R.id.menu_home -> {
item?.setIcon(R.drawable.ic_menu_home)
showFragment(homeFragment)
-
return true
}
R.id.menu_categories -> {
item?.setIcon(R.drawable.ic_menu_categories)
showFragment(CategoriesFragment())
-
return true
}
R.id.menu_search -> {
@@ -311,17 +265,4 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS
}
}, 2000)
}
-
- /*
- * get Accent color from OS
- *
- * */
- private fun getAccentColor() {
-
- accentColorOS=this.resources.getColor(R.color.colorAccent);
-
-
-
- }
-
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/foundation/e/apps/api/GitlabDataRequest.kt b/app/src/main/java/foundation/e/apps/api/GitlabDataRequest.kt
new file mode 100644
index 0000000000000000000000000000000000000000..d5e5efad898de9b21676f1676dd736c81be6fdcb
--- /dev/null
+++ b/app/src/main/java/foundation/e/apps/api/GitlabDataRequest.kt
@@ -0,0 +1,69 @@
+/*
+ Copyright (C) 2019 e Foundation
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+ */
+
+package foundation.e.apps.api
+
+import android.content.Context
+import android.os.Build
+import com.google.gson.Gson
+import com.google.gson.JsonParser
+import foundation.e.apps.application.model.Application
+import foundation.e.apps.application.model.data.BasicData
+import foundation.e.apps.application.model.release.ReleaseData
+import foundation.e.apps.applicationmanager.ApplicationManager
+import foundation.e.apps.utils.*
+import java.io.InputStreamReader
+
+
+class GitlabDataRequest {
+
+
+ fun requestGmsCoreRelease(callback: (Error?, GitlabDataResult?) -> Unit) = try {
+ val url = Constants.RELEASE_API + Constants.MICROG_ID + Constants.RELEASE_ENDPOINT
+ val urlConnection = Common.createConnection(url, Constants.REQUEST_METHOD_GET)
+ val isr = InputStreamReader(urlConnection.inputStream)
+ val element = JsonParser().parse(isr)
+
+ val releaseList: List = Gson().fromJson(element.toString(),
+ Array::class.java).toList()
+ urlConnection.disconnect()
+ var buildTag = Build.TAGS.split("-").toTypedArray();
+ val osReleaseType = buildTag[0];
+ var releaseUrl = ""
+
+ releaseList[0].assets.links.forEach {
+ if (it.name.contains(osReleaseType)) {
+ releaseUrl = it.url
+ }
+ }
+
+
+ callback.invoke(null, GitlabDataResult(SystemAppDataSource.createDataSource(Constants.MICROG_ID.toString(),
+ releaseList[0].tag_name, Constants.MICROG_ICON_URI, releaseUrl)))
+
+ } catch (e: Exception) {
+ callback.invoke(Error.findError(e), null)
+ }
+
+ class GitlabDataResult(private val data: BasicData) {
+ fun getApplications(applicationManager: ApplicationManager, context: Context): ArrayList {
+ return ApplicationParser.parseSystemAppData(applicationManager, context, data)
+ }
+ }
+
+
+}
diff --git a/app/src/main/java/foundation/e/apps/api/ListApplicationsRequest.kt b/app/src/main/java/foundation/e/apps/api/ListApplicationsRequest.kt
index 558c43d0f5f4933b65c0fc8bb01b4de7ae5c7d46..e3646898312c18616bcfadf76a7a3326979ab785 100644
--- a/app/src/main/java/foundation/e/apps/api/ListApplicationsRequest.kt
+++ b/app/src/main/java/foundation/e/apps/api/ListApplicationsRequest.kt
@@ -23,6 +23,7 @@ import com.fasterxml.jackson.annotation.JsonProperty
import foundation.e.apps.MainActivity.Companion.mActivity
import foundation.e.apps.application.model.Application
import foundation.e.apps.application.model.data.BasicData
+import foundation.e.apps.application.model.release.ReleaseData
import foundation.e.apps.applicationmanager.ApplicationManager
import foundation.e.apps.utils.ApplicationParser
import foundation.e.apps.utils.Common
@@ -59,6 +60,4 @@ class ListApplicationsRequest(private val category: String, private val page: In
}
}
-
-
}
diff --git a/app/src/main/java/foundation/e/apps/api/ListPwasRequest.kt b/app/src/main/java/foundation/e/apps/api/ListPwasRequest.kt
index 9db933bf1d6ac49c7138444f0052f69c13229e66..87c9edbb962778ad979271cbd4aa6114607f1b5f 100644
--- a/app/src/main/java/foundation/e/apps/api/ListPwasRequest.kt
+++ b/app/src/main/java/foundation/e/apps/api/ListPwasRequest.kt
@@ -26,7 +26,6 @@ class ListPwasRequest(private val category: String, private val page: Int, priva
urlConnection.disconnect()
callback.invoke(null, result)
-
} catch (e: Exception) {
callback.invoke(Error.findError(e), null)
}
diff --git a/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt b/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt
index f1c94cacde0be2630c3611eeef884bfff8469102..f860a001b767bb8aa703d9a9c9225c1f1bd352e6 100644
--- a/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt
+++ b/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt
@@ -32,7 +32,6 @@ import android.text.SpannableStringBuilder
import android.text.method.LinkMovementMethod
import android.text.style.ForegroundColorSpan
import android.util.DisplayMetrics
-import android.util.Log
import android.util.TypedValue
import android.view.Menu
import android.view.MenuItem
@@ -40,10 +39,8 @@ import android.view.View
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
-import androidx.annotation.ColorInt
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
-import androidx.appcompat.view.ContextThemeWrapper
import androidx.appcompat.widget.Toolbar
import com.google.android.material.snackbar.Snackbar
import foundation.e.apps.MainActivity.Companion.sharedPreferences
@@ -93,7 +90,7 @@ class ApplicationActivity :
private var imageMargin = 0
private var defaultElevation = 0f
private val sharedPrefFile = "kotlinsharedpreference"
- var accentColorOS = 0
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -116,14 +113,6 @@ class ApplicationActivity :
this.applicationPackageName = applicationPackageName!!
applicationManagerServiceConnection.bindService(this)
}
-
- getAccentColor()
- app_install.setTextColor(Color.parseColor("#ffffff"))
- app_install.setBackgroundColor(accentColorOS)
- app_category.setTextColor(accentColorOS)
- app_expand_description.setTextColor(accentColorOS)
-
-
}
@@ -760,8 +749,4 @@ class ApplicationActivity :
applicationManagerServiceConnection.unbindService(this)
}
}
-
- private fun getAccentColor() {
- accentColorOS=this.resources.getColor(R.color.colorAccent);
- }
}
diff --git a/app/src/main/java/foundation/e/apps/application/ApplicationViewHolder.kt b/app/src/main/java/foundation/e/apps/application/ApplicationViewHolder.kt
index 7df91db5c37d901be7857e76386e1bf0f51c9566..ddb116290a91d81d13420df47d8c9ad0080f034a 100644
--- a/app/src/main/java/foundation/e/apps/application/ApplicationViewHolder.kt
+++ b/app/src/main/java/foundation/e/apps/application/ApplicationViewHolder.kt
@@ -19,6 +19,7 @@ package foundation.e.apps.application
import android.annotation.SuppressLint
import android.app.Activity
+import android.content.Context
import android.graphics.Bitmap
import android.graphics.Color
import android.view.Gravity
@@ -39,23 +40,25 @@ import foundation.e.apps.application.model.data.PwasBasicData
import foundation.e.apps.application.viewmodel.ApplicationViewModel
import foundation.e.apps.utils.Common
import foundation.e.apps.utils.Common.toMiB
+import foundation.e.apps.utils.Constants
import foundation.e.apps.utils.Error
import foundation.e.apps.utils.Execute
import kotlinx.android.synthetic.main.application_list_item.view.*
import kotlinx.android.synthetic.main.install_button_layout.view.*
+import java.lang.Exception
-class ApplicationViewHolder(private val activity: Activity, private val view: View, accentColorOS: Int) :
+class ApplicationViewHolder(private val activity: Activity, private val view: View) :
RecyclerView.ViewHolder(view),
ApplicationStateListener,
Downloader.DownloadProgressCallback,
BasicData.IconLoaderCallback,
- PwasBasicData.IconLoaderCallback {
+ PwasBasicData.IconLoaderCallback{
private val icon: ImageView = view.app_icon
private val title: TextView = view.app_title
- private val pwa_icon: TextView = view.pwa_sympol
+ private val pwa_icon :TextView =view.pwa_sympol
private val author: TextView = view.app_author
private val ratingBar: RatingBar = view.app_rating_bar
private val rating: TextView = view.app_rating
@@ -64,32 +67,28 @@ class ApplicationViewHolder(private val activity: Activity, private val view: Vi
private var application: Application? = null
private val applicationViewModel = ApplicationViewModel()
private var downloader: Downloader? = null
-var accentColorOS=accentColorOS;
+
init {
- pwa_icon.visibility = View.GONE
+ pwa_icon.visibility=View.GONE
view.setOnClickListener {
if (application != null) {
- applicationViewModel.onApplicationClick(view.context, application!!)
+ if (application!!.packageName != Constants.MICROG_PACKAGE)
+ applicationViewModel.onApplicationClick(view.context, application!!)
}
}
-
-
- installButton.setTextColor(Color.parseColor("#ffffff"))
- if(0!=this.accentColorOS){
- installButton.setBackgroundColor(this.accentColorOS)
- }
installButton?.setOnClickListener {
if (application?.fullData != null &&
application!!.fullData!!.getLastVersion() == null) {
Snackbar.make(view, activity.getString(
Error.APK_UNAVAILABLE.description),
Snackbar.LENGTH_LONG).show()
- } else if (application?.pwabasicdata != null) {
+ } else if(application?.pwabasicdata!=null){
application?.pwaInstall(activity)
- } else if (application?.searchAppsBasicData != null && application?.searchAppsBasicData!!.is_pwa) {
+ }else if(application?.searchAppsBasicData!=null &&application?.searchAppsBasicData!!.is_pwa){
application?.pwaInstall(activity)
- } else {
+ }
+ else {
application?.buttonClicked(activity, activity)
}
}
@@ -97,46 +96,46 @@ var accentColorOS=accentColorOS;
fun createApplicationView(app: Application) {
- pwa_icon.visibility = View.GONE
- this.application = app
-
- if (app.basicData != null) {
- this.application?.removeListener(this)
- this.application = app
- icon.setImageDrawable(view.context.resources.getDrawable(R.drawable.ic_app_default))
- application!!.loadIcon(this)
- application!!.addListener(this)
- title.text = application!!.basicData!!.name
- author.text = application!!.basicData!!.author
- ratingBar.rating = application!!.basicData!!.ratings!!.rating!!
- if (application!!.basicData!!.ratings!!.rating != -1f) {
- rating.text = application!!.basicData!!.ratings!!.rating.toString()
- } else {
- rating.text = activity.getString(R.string.not_available)
- }
- if (application!!.basicData!!.privacyRating != null && application!!.basicData!!.privacyRating != -1f) {
- privacyScore.text = application!!.basicData!!.privacyRating.toString()
- } else {
- privacyScore.text = activity.getString(R.string.not_available)
- }
- } else {
- this.application?.removeListener(this)
+ pwa_icon.visibility = View.GONE
this.application = app
- icon.setImageDrawable(view.context.resources.getDrawable(R.drawable.ic_app_default))
- application!!.addListener(this)
- if (application!!.searchAppsBasicData != null) {
- if (application!!.searchAppsBasicData!!.is_pwa) {
- pwa_icon.visibility = View.VISIBLE
+
+ if (app.basicData != null) {
+ this.application?.removeListener(this)
+ this.application = app
+ icon.setImageDrawable(view.context.resources.getDrawable(R.drawable.ic_app_default))
+ application!!.loadIcon(this)
+ application!!.addListener(this)
+ title.text = application!!.basicData!!.name
+ author.text = application!!.basicData!!.author
+ ratingBar.rating = application!!.basicData!!.ratings!!.rating!!
+ if (application!!.basicData!!.ratings!!.rating != -1f) {
+ rating.text = application!!.basicData!!.ratings!!.rating.toString()
+ } else {
+ rating.text = activity.getString(R.string.not_available)
+ }
+ if (application!!.basicData!!.privacyRating != null && application!!.basicData!!.privacyRating != -1f) {
+ privacyScore.text = application!!.basicData!!.privacyRating.toString()
+ } else {
+ privacyScore.text = activity.getString(R.string.not_available)
}
- application!!.SearchAppsloadIcon(this)
- title.text = application!!.searchAppsBasicData!!.name
- author.text = application!!.searchAppsBasicData!!.author
- } else {
- application!!.PwaloadIcon(this)
- title.text = application!!.pwabasicdata!!.name
+ }else{
+ this.application?.removeListener(this)
+ this.application = app
+ icon.setImageDrawable(view.context.resources.getDrawable(R.drawable.ic_app_default))
+ application!!.addListener(this)
+ if (application!!.searchAppsBasicData != null) {
+ if (application!!.searchAppsBasicData!!.is_pwa) {
+ pwa_icon.visibility = View.VISIBLE
+ }
+ application!!.SearchAppsloadIcon(this)
+ title.text = application!!.searchAppsBasicData!!.name
+ author.text = application!!.searchAppsBasicData!!.author
+ } else {
+ application!!.PwaloadIcon(this)
+ title.text = application!!.pwabasicdata!!.name
+ }
}
- }
stateChanged(application!!.state)
}
@@ -148,47 +147,30 @@ var accentColorOS=accentColorOS;
override fun stateChanged(state: State) {
Execute({}, {
-
- // installButton.setBackgroundResource(R.drawable.app_install_border_simple)
+ installButton.setBackgroundResource(R.drawable.app_install_border_simple)
installButton?.text = activity.getString(state.installButtonTextId)
- when (state) {
- State.NOT_DOWNLOADED -> {
- if(0!=this.accentColorOS){
- installButton.setTextColor(this.accentColorOS)
- }
- else{
+ when (state) {
- installButton.setTextColor(Color.parseColor("#0088ED"))
- }
+ State.NOT_DOWNLOADED ->{
+ installButton.setTextColor(Color.parseColor("#0088ED"))
installButton.setBackgroundResource(R.drawable.app_install_border_simple)
installButton.isEnabled = true
}
State.INSTALLED -> {
+
installButton?.isEnabled =
Common.appHasLaunchActivity(activity, application!!.packageName)
- if(0!=this.accentColorOS){
- installButton!!.setBackgroundColor(this.accentColorOS)
- }
- else{
- installButton!!.setBackgroundResource(R.drawable.app_install_border)
- }
installButton.setTextColor(Color.parseColor("#FAFAFA"))
-
+ installButton!!.setBackgroundResource(R.drawable.app_install_border)
}
State.INSTALLING -> {
installButton?.isEnabled = false
}
State.NOT_UPDATED -> {
installButton.setTextColor(Color.parseColor("#FAFAFA"))
- //installButton!!.setBackgroundResource(R.drawable.app_install_border)
- if(0!=this.accentColorOS){
- installButton!!.setBackgroundColor(this.accentColorOS)
- }
- else{
- installButton!!.setBackgroundResource(R.drawable.app_install_border)
- }
+ installButton!!.setBackgroundResource(R.drawable.app_install_border)
installButton?.isEnabled = true
}
else -> {
@@ -196,7 +178,6 @@ var accentColorOS=accentColorOS;
installButton?.isEnabled = true
}
}
-
})
}
@@ -223,5 +204,4 @@ var accentColorOS=accentColorOS;
downloader?.removeListener(this)
downloader = null
}
-
}
diff --git a/app/src/main/java/foundation/e/apps/application/SmallApplicationViewHolder.kt b/app/src/main/java/foundation/e/apps/application/SmallApplicationViewHolder.kt
index f5d4934ae94924f9d686a87ac33b4b369056c9ee..20c5d129cdd3b4da9b7b1fb320cb7407cad83907 100644
--- a/app/src/main/java/foundation/e/apps/application/SmallApplicationViewHolder.kt
+++ b/app/src/main/java/foundation/e/apps/application/SmallApplicationViewHolder.kt
@@ -53,7 +53,6 @@ class SmallApplicationViewHolder(private val activity: Activity, private val vie
BasicData.IconLoaderCallback,
PwasBasicData.IconLoaderCallback{
-
private val icon: ImageView = view.app_icon
private val title: TextView = view.app_title
private val installButton: Button = view.app_install
@@ -68,7 +67,6 @@ class SmallApplicationViewHolder(private val activity: Activity, private val vie
applicationViewModel.onApplicationClick(view.context, application!!)
}
}
-
installButton.setOnClickListener {
if (application?.fullData != null &&
application!!.fullData!!.getLastVersion() == null) {
@@ -84,6 +82,7 @@ class SmallApplicationViewHolder(private val activity: Activity, private val vie
}
}
}
+
fun createApplicationView(app: Application) {
if(app.basicData!=null) {
this.application?.removeListener(this)
@@ -117,14 +116,11 @@ class SmallApplicationViewHolder(private val activity: Activity, private val vie
installButton.text = activity.getString(state.installButtonTextId)
installButton.clearAnimation()
installButton.clearFocus();
- var color = application?.getAccentColor(activity);
when (state) {
+
State.NOT_DOWNLOADED ->{
+ installButton.setTextColor(Color.parseColor("#0088ED"))
installButton.setBackgroundResource(R.drawable.app_install_border_simple)
- if (color != null) {
-
- installButton.setTextColor(color)
- };
installButton.isEnabled = true
}
@@ -132,10 +128,7 @@ class SmallApplicationViewHolder(private val activity: Activity, private val vie
installButton.isEnabled =
Common.appHasLaunchActivity(activity, application!!.packageName)
installButton.setTextColor(Color.parseColor("#FAFAFA"))
- if (color != null) {
- //installButton!!.setBackgroundResource(R.drawable.app_install_border)
- installButton.setBackgroundColor(color)
- };
+ installButton!!.setBackgroundResource(R.drawable.app_install_border)
}
State.INSTALLING -> {
installButton.isEnabled = false
@@ -144,11 +137,7 @@ class SmallApplicationViewHolder(private val activity: Activity, private val vie
}
State.NOT_UPDATED -> {
installButton.setTextColor(Color.parseColor("#FAFAFA"))
- // installButton!!.setBackgroundResource(R.drawable.app_install_border)
- if (color != null) {
- //installButton!!.setBackgroundResource(R.drawable.app_install_border)
- installButton.setBackgroundColor(color)
- };
+ installButton!!.setBackgroundResource(R.drawable.app_install_border)
installButton.isEnabled = true
}
else -> {
diff --git a/app/src/main/java/foundation/e/apps/application/model/Application.kt b/app/src/main/java/foundation/e/apps/application/model/Application.kt
index 67e6dbc8efb9447a38a51a429b27016bb45f6e59..de20278c6a682f58e7cba9ca8d6dd0c3086f489f 100644
--- a/app/src/main/java/foundation/e/apps/application/model/Application.kt
+++ b/app/src/main/java/foundation/e/apps/application/model/Application.kt
@@ -18,16 +18,11 @@
package foundation.e.apps.application.model
import android.Manifest
-import android.R
import android.app.Activity
import android.app.DownloadManager
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
-import android.util.Log
-import android.util.TypedValue
-import androidx.annotation.ColorInt
-import androidx.appcompat.view.ContextThemeWrapper
import foundation.e.apps.MainActivity.Companion.mActivity
import foundation.e.apps.pwa.PwaInstaller
import foundation.e.apps.XAPK.XAPKFile
@@ -36,25 +31,26 @@ import foundation.e.apps.api.AppDownloadedRequest
import foundation.e.apps.api.PackageNameSearchRequest
import foundation.e.apps.application.model.State.*
import foundation.e.apps.application.model.data.*
+import foundation.e.apps.application.model.release.ReleaseData
import foundation.e.apps.applicationmanager.ApplicationManager
-import foundation.e.apps.utils.Common
-import foundation.e.apps.utils.Constants
-import foundation.e.apps.utils.Error
-import foundation.e.apps.utils.Execute
+import foundation.e.apps.utils.*
import java.util.concurrent.atomic.AtomicInteger
class Application(val packageName: String, private val applicationManager: ApplicationManager) :
- DownloaderInterface, InstallerInterface {
+ DownloaderInterface, InstallerInterface{
+
+
private val uses = AtomicInteger(0)
private val info = ApplicationInfo(packageName)
private val stateManager = StateManager(info, this, applicationManager)
var basicData: BasicData? = null
+ var releaseData: ReleaseData? = null
var fullData: FullData? = null
- var pwabasicdata: PwasBasicData? = null
+ var pwabasicdata : PwasBasicData? = null
var pwaFullData: PwaFullData? = null
- var searchAppsBasicData: SearchAppsBasicData? = null
+ var searchAppsBasicData : SearchAppsBasicData? =null
fun addListener(listener: ApplicationStateListener) {
@@ -83,31 +79,39 @@ class Application(val packageName: String, private val applicationManager: Appli
fun checkForStateUpdate(context: Context) {
if (basicData != null) {
stateManager.find(context, basicData!!)
- } else if (searchAppsBasicData != null) {
- if (searchAppsBasicData!!.is_pwa) {
+ }
+ else if(searchAppsBasicData !=null){
+ if(searchAppsBasicData!!.is_pwa){
// stateManager.pwaFind()
- } else {
+ }
+ else{
stateManager.searchAppsFind(context, searchAppsBasicData!!)
}
- } else if (pwabasicdata != null) {
+ }
+ else if(pwabasicdata!=null){
// stateManager.pwaFind()
}
}
+ private fun checkForSystemAppStateUpdate(context: Context) {
+ if (basicData != null) {
+ stateManager.findSystemApp(context, basicData!!)
+ }
+ }
fun pwaInstall(context: Context) {
var error: Error? = null
- Thread(Runnable {
- error = assertFullData(context)
+ Thread(Runnable {
+ error=assertFullData(context)
- mActivity.runOnUiThread(Runnable {
+ mActivity.runOnUiThread(Runnable{
run {
if (error == null) {
- val intent = Intent(context, PwaInstaller::class.java)
- intent.putExtra("NAME", pwaFullData!!.name)
- intent.putExtra("URL", pwaFullData!!.url)
+ val intent=Intent(context, PwaInstaller::class.java)
+ intent.putExtra("NAME",pwaFullData!!.name)
+ intent.putExtra("URL",pwaFullData!!.url)
context.startActivity(intent)
} else {
stateManager.notifyError(error!!)
@@ -165,22 +169,31 @@ class Application(val packageName: String, private val applicationManager: Appli
}
fun download(context: Context) {
- val error = assertFullData(context)
- if (error == null) {
- if (isAPKArchCompatible()) {
- downloader = Downloader(info, fullData!!, this)
- stateManager.notifyDownloading(downloader!!)
- downloader!!.download(context)
- synchronized(blocker) {
- blocker.wait()
+ if (basicData?.name == Constants.MICROG) {
+ downloader = Downloader(info, SystemAppDataSource.getFullData(), this)
+ stateManager.notifyDownloading(downloader!!)
+ downloader!!.downloadSystemApp(context)
+ synchronized(blocker) {
+ blocker.wait()
+ }
+ } else {
+ val error = assertFullData(context)
+ if (error == null) {
+ if (isAPKArchCompatible()) {
+ downloader = Downloader(info, fullData!!, this)
+ stateManager.notifyDownloading(downloader!!)
+ downloader!!.download(context)
+ synchronized(blocker) {
+ blocker.wait()
+ }
+ } else {
+ stateManager.notifyError(Error.APK_INCOMPATIBLE)
+ onDownloadComplete(context, DownloadManager.STATUS_FAILED)
}
} else {
- stateManager.notifyError(Error.APK_INCOMPATIBLE)
+ stateManager.notifyError(error)
onDownloadComplete(context, DownloadManager.STATUS_FAILED)
}
- } else {
- stateManager.notifyError(error)
- onDownloadComplete(context, DownloadManager.STATUS_FAILED)
}
}
@@ -200,23 +213,29 @@ class Application(val packageName: String, private val applicationManager: Appli
override fun onDownloadComplete(context: Context, status: Int) {
if (status == DownloadManager.STATUS_SUCCESSFUL) {
- Execute({
- AppDownloadedRequest(basicData!!.id, fullData!!.getLastVersion()?.apkArchitecture).request()
- }, {})
- if (info.isXapk(fullData!!, basicData)) {
- isInstalling = true
- XAPKFile(info.getxApkFile(context, basicData!!), this)
+ if (basicData?.packageName == Constants.MICROG_PACKAGE) {
+ installSystemApp(context)
} else {
- install(context)
+ Execute({
+ AppDownloadedRequest(basicData!!.id,fullData!!.getLastVersion()?.apkArchitecture).request()
+ }, {})
+ if(info.isXapk(fullData!!,basicData)){
+ isInstalling=true
+ XAPKFile(info.getxApkFile(context,basicData!!),this)
+ }
+ else {
+ install(context)
+ }
}
} else {
synchronized(blocker) {
blocker.notify()
}
- if (basicData != null) {
+ if(basicData!=null) {
info.getApkFile(context, basicData!!).delete()
applicationManager.stopInstalling(context, this)
- } else {
+ }
+ else{
applicationManager.stopInstalling(context, this)
}
}
@@ -229,6 +248,12 @@ class Application(val packageName: String, private val applicationManager: Appli
info.install(context, basicData!!, this)
}
+ private fun installSystemApp(context: Context) {
+ isInstalling = true
+ checkForSystemAppStateUpdate(context)
+ info.install(context, basicData!!, this)
+ }
+
override fun onInstallationComplete(context: Context) {
synchronized(blocker) {
blocker.notify()
@@ -251,12 +276,16 @@ class Application(val packageName: String, private val applicationManager: Appli
fun assertFullData(context: Context): Error? {
if (fullData != null) {
return null
- } else if (pwabasicdata != null) {
+ }
+ else if(pwabasicdata != null){
return findPwaFullData(context)
- } else if (searchAppsBasicData != null) {
- if (searchAppsBasicData!!.is_pwa) {
+ }
+
+ else if(searchAppsBasicData!=null){
+ if(searchAppsBasicData!!.is_pwa){
return findSearchResultPwaFulldata(context)
- } else {
+ }
+ else{
findSearchAppsFullData(context)
}
}
@@ -295,7 +324,7 @@ class Application(val packageName: String, private val applicationManager: Appli
}
var error: Error? = null
if (Common.isNetworkAvailable(context)) {
- AppDetailRequest(basicData!!.id).request { applicationError, fullData ->
+ AppDetailRequest(basicData!!.id).request { applicationError, fullData->
when (applicationError) {
null -> {
error = Error.NO_RESULTS
@@ -314,7 +343,6 @@ class Application(val packageName: String, private val applicationManager: Appli
}
return error
}
-
private fun findSearchAppsFullData(context: Context): Error? {
if (searchAppsBasicData == null) {
val error = findBasicData(context)
@@ -324,7 +352,7 @@ class Application(val packageName: String, private val applicationManager: Appli
}
var error: Error? = null
if (Common.isNetworkAvailable(context)) {
- AppDetailRequest(searchAppsBasicData!!.id).request { applicationError, fullData ->
+ AppDetailRequest(searchAppsBasicData!!.id).request { applicationError, fullData->
when (applicationError) {
null -> {
error = Error.NO_RESULTS
@@ -354,7 +382,7 @@ class Application(val packageName: String, private val applicationManager: Appli
}
var error: Error? = null
if (Common.isNetworkAvailable(context)) {
- AppDetailRequest(pwabasicdata!!.id).Pwarequest { applicationError, PwaFullData ->
+ AppDetailRequest(pwabasicdata!!.id ).Pwarequest { applicationError, PwaFullData ->
when (applicationError) {
null -> {
error = Error.NO_RESULTS
@@ -383,7 +411,7 @@ class Application(val packageName: String, private val applicationManager: Appli
}
var error: Error? = null
if (Common.isNetworkAvailable(context)) {
- AppDetailRequest(searchAppsBasicData!!.id).Pwarequest { applicationError, PwaFullData ->
+ AppDetailRequest(searchAppsBasicData!!.id ).Pwarequest { applicationError, PwaFullData ->
when (applicationError) {
null -> {
error = Error.NO_RESULTS
@@ -404,10 +432,15 @@ class Application(val packageName: String, private val applicationManager: Appli
}
+
fun loadIcon(iconLoaderCallback: BasicData.IconLoaderCallback) {
basicData?.loadIconAsync(this, iconLoaderCallback)
}
+ fun loadSystemIcon(iconLoaderCallback: BasicData.IconLoaderCallback) {
+ basicData?.loadSystemAppIconAsync(this, iconLoaderCallback)
+ }
+
fun PwaloadIcon(iconLoaderCallback: PwasBasicData.IconLoaderCallback) {
pwabasicdata?.loadIconAsync(this, iconLoaderCallback)
}
@@ -445,15 +478,4 @@ class Application(val packageName: String, private val applicationManager: Appli
Pwaupdate(pwaFullData.pwabasicdata, context)
pwaFullData.pwabasicdata = pwabasicdata!!
}
-
- /*
- * get Accent color from OS
- *
- */
- fun getAccentColor(context: Context): Int {
-
- val color =context.resources.getColor(foundation.e.apps.R.color.colorAccent);
- return color;
-
- }
}
diff --git a/app/src/main/java/foundation/e/apps/application/model/ApplicationInfo.kt b/app/src/main/java/foundation/e/apps/application/model/ApplicationInfo.kt
index dde66db6c843b1b43c9f2d8f7053c0ed09af1ea8..47935086b0937e0a760036a60f8d2be161a06f89 100644
--- a/app/src/main/java/foundation/e/apps/application/model/ApplicationInfo.kt
+++ b/app/src/main/java/foundation/e/apps/application/model/ApplicationInfo.kt
@@ -21,6 +21,7 @@ import android.content.Context
import android.content.pm.PackageInfo
import android.content.pm.PackageManager
import android.os.Environment
+import android.util.Log
import foundation.e.apps.application.model.data.BasicData
import foundation.e.apps.application.model.data.FullData
import foundation.e.apps.utils.Common
@@ -31,21 +32,40 @@ class ApplicationInfo(private val packageName: String) {
fun isLastVersionInstalled(context: Context, lastVersionNumber: String): Boolean {
val packageInfo = getPackageInfo(context) ?: return false
- if (lastVersionNumber.isBlank() ||
- !lastVersionNumber.contains("(") ||
- !lastVersionNumber.contains(")")) {
- return true
- }
- if (!Common.isSystemApp(context.packageManager, packageName)) {
- try {
- val pattern = Pattern.compile("[(]\\d+[)]")
- val matcher = pattern.matcher(lastVersionNumber)
- matcher.find()
- val updateVersionCode = matcher.group()
- .replace("(", "")
- .replace(")", "")
- return (updateVersionCode.toInt() <= packageInfo.versionCode)
- } catch (exception: Exception) {
+
+ if (Common.isSystemApp(context.packageManager, packageName)) {
+
+ if (lastVersionNumber.isBlank())
+ return true
+ else {
+ val currentVersion = packageInfo.versionName.replace(".", "").replace("-", "")
+ val currentVersionFiltered = currentVersion.filter { it.isDigit() }
+ // val regex = "-v(.*)-".toRegex()
+ val tagVersion = lastVersionNumber.filter { it.isDigit() }
+ try {
+ return tagVersion.toBigInteger() > currentVersionFiltered.toBigInteger()
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ }
+ } else {
+
+ if (lastVersionNumber.isBlank() ||
+ !lastVersionNumber.contains("(") ||
+ !lastVersionNumber.contains(")")) {
+ return true
+ }
+ if (!Common.isSystemApp(context.packageManager, packageName)) {
+ try {
+ val pattern = Pattern.compile("[(]\\d+[)]")
+ val matcher = pattern.matcher(lastVersionNumber)
+ matcher.find()
+ val updateVersionCode = matcher.group()
+ .replace("(", "")
+ .replace(")", "")
+ return (updateVersionCode.toInt() <= packageInfo.versionCode)
+ } catch (exception: Exception) {
+ }
}
}
return true
@@ -91,23 +111,21 @@ class ApplicationInfo(private val packageName: String) {
Installer(data.packageName, getApkFile(context, data), callback).install(context)
}
- fun isXapk( fullData: FullData, basicData: BasicData?): Boolean {
+ fun isXapk(fullData: FullData, basicData: BasicData?): Boolean {
return fullData.getLastVersion()!!.is_xapk && fullData.getLastVersion()?.downloadLink!!.endsWith(".xapk")
}
fun getApkOrXapkFileName(fullData: FullData, basicData: BasicData): String? {
- if(isXapk(fullData,basicData) ) {
+ if (isXapk(fullData, basicData)) {
return getxApkFilename(basicData)
- }
- else
+ } else
return getApkFilename(basicData)
}
- fun getApkOrXapkFile(context: Context,fullData: FullData, basicData: BasicData): File {
- if(isXapk(fullData,basicData)){
- return getxApkFile(context,basicData)
- }
- else
- return getApkFile(context,basicData)
+ fun getApkOrXapkFile(context: Context, fullData: FullData, basicData: BasicData): File {
+ if (isXapk(fullData, basicData)) {
+ return getxApkFile(context, basicData)
+ } else
+ return getApkFile(context, basicData)
}
}
diff --git a/app/src/main/java/foundation/e/apps/application/model/Downloader.kt b/app/src/main/java/foundation/e/apps/application/model/Downloader.kt
index 0748ad76886eb5a2c78e0a7fe77b8c7471d14b1e..6c3b51bd3d024a09c40798a1fde6ad4ea7a93db1 100644
--- a/app/src/main/java/foundation/e/apps/application/model/Downloader.kt
+++ b/app/src/main/java/foundation/e/apps/application/model/Downloader.kt
@@ -25,13 +25,18 @@ import android.content.IntentFilter
import android.net.Uri
import android.os.AsyncTask
import android.os.Environment
+import android.util.Log
import foundation.e.apps.R
+import foundation.e.apps.application.model.data.BasicData
import foundation.e.apps.application.model.data.FullData
import foundation.e.apps.utils.Constants
-class Downloader(private val applicationInfo: ApplicationInfo, private val fullData: FullData,
+class Downloader(private val applicationInfo: ApplicationInfo,
+ private val fullData: FullData,
private val downloaderInterface: DownloaderInterface) :
IntegrityVerificationCallback {
+
+
private lateinit var downloadManager: DownloadManager
private lateinit var request: DownloadManager.Request
private var downloadId: Long = 0
@@ -55,7 +60,7 @@ class Downloader(private val applicationInfo: ApplicationInfo, private val fullD
}
fun download(context: Context) {
- if (fullData.getLastVersion() != null) {
+ if (fullData?.getLastVersion() != null) {
downloadManager = context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
registerReceivers(context)
initialiseDownloadManagerRequest(context)
@@ -68,6 +73,16 @@ class Downloader(private val applicationInfo: ApplicationInfo, private val fullD
}
}
+ fun downloadSystemApp(context: Context) {
+ downloadManager = context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
+ registerReceivers(context)
+ initialiseDownloadManagerRequestForSystemApps(context)
+ downloadId = downloadManager.enqueue(request)
+ Thread {
+ handleDownloadUpdates()
+ }.start()
+ }
+
private fun registerReceivers(context: Context) {
context.registerReceiver(onComplete,
IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE))
@@ -81,14 +96,29 @@ class Downloader(private val applicationInfo: ApplicationInfo, private val fullD
request = DownloadManager.Request(
Uri.parse(
- Constants.DOWNLOAD_URL + fullData.getLastVersion()!!.downloadLink))
+ Constants.DOWNLOAD_URL + fullData?.getLastVersion()!!.downloadLink))
.apply {
setTitle(fullData.basicData.name)
setDescription(context.getString(R.string.download_notification_description))
setDestinationInExternalFilesDir(
context,
Environment.DIRECTORY_DOWNLOADS,
- applicationInfo.getApkOrXapkFileName(fullData,fullData.basicData))
+ applicationInfo.getApkOrXapkFileName(fullData, fullData.basicData))
+ }
+ }
+
+ private fun initialiseDownloadManagerRequestForSystemApps(context: Context) {
+
+ request = DownloadManager.Request(
+ Uri.parse(
+ fullData.downloadUrl))
+ .apply {
+ setTitle(fullData.name)
+ setDescription(context.getString(R.string.download_notification_description))
+ setDestinationInExternalFilesDir(
+ context,
+ Environment.DIRECTORY_DOWNLOADS,
+ fullData.basicData.let { applicationInfo.getApkFilename(it) })
}
}
@@ -128,11 +158,13 @@ class Downloader(private val applicationInfo: ApplicationInfo, private val fullD
unregisterReceivers(context)
val status = getDownloadStatus()
if (status != null && status == DownloadManager.STATUS_SUCCESSFUL) {
- IntegrityVerificationTask(
- applicationInfo,
- fullData,
- this@Downloader)
- .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, context)
+ fullData?.let {
+ IntegrityVerificationTask(
+ applicationInfo,
+ it,
+ this@Downloader)
+ .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, context)
+ }
} else {
downloaderInterface.onDownloadComplete(context, DownloadManager.STATUS_FAILED)
}
diff --git a/app/src/main/java/foundation/e/apps/application/model/Installer.kt b/app/src/main/java/foundation/e/apps/application/model/Installer.kt
index bd398199abad0f7f6cd6b3301d31ad5ebf9baac7..a0952f3f6a86fc09ef6b7078ef061e29adb5dc6e 100644
--- a/app/src/main/java/foundation/e/apps/application/model/Installer.kt
+++ b/app/src/main/java/foundation/e/apps/application/model/Installer.kt
@@ -26,7 +26,10 @@ import android.net.Uri
import android.util.Log
import androidx.core.content.ContextCompat
import androidx.core.content.FileProvider
+import foundation.e.apps.R
import foundation.e.apps.XAPK.FsUtils.deleteFileOrDir
+import foundation.e.apps.utils.Constants
+import foundation.e.apps.utils.PreferenceStorage
import java.io.File
import java.io.IOException
import java.io.InputStream
@@ -141,9 +144,14 @@ class Installer(private val packageName: String,
Log.i(TAG, "Broadcast received")
var path = apk.absolutePath.split("Download")
//delete all APK file after install
- deleteFileOrDir(path[0]+"Download");
+ deleteFileOrDir(path[0] + "Download");
callback.onInstallationComplete(p0)
+
+ if (packageName == Constants.MICROG_PACKAGE) {
+ PreferenceStorage(p0).save(p0.getString(R.string.prefs_microg_vrsn_installed), true)
+ }
+
}
}
}
diff --git a/app/src/main/java/foundation/e/apps/application/model/IntegrityVerificationTask.kt b/app/src/main/java/foundation/e/apps/application/model/IntegrityVerificationTask.kt
index 536e8455380d79b1969e9031905dbdec3e83a386..d926bdbef08dac0c3499e592faf0245c4625035a 100644
--- a/app/src/main/java/foundation/e/apps/application/model/IntegrityVerificationTask.kt
+++ b/app/src/main/java/foundation/e/apps/application/model/IntegrityVerificationTask.kt
@@ -20,6 +20,7 @@ package foundation.e.apps.application.model
import android.content.Context
import android.os.AsyncTask
import foundation.e.apps.application.model.data.FullData
+import foundation.e.apps.utils.Constants
import org.bouncycastle.jce.provider.BouncyCastleProvider
import org.bouncycastle.openpgp.PGPCompressedData
import org.bouncycastle.openpgp.PGPPublicKeyRingCollection
@@ -43,19 +44,21 @@ class IntegrityVerificationTask(
private var verificationSuccessful: Boolean = false
override fun doInBackground(vararg context: Context): Context {
-// var file= (applicationInfo.getApkFile(context[0],
-// fullData.basicData).absolutePath).length
- verificationSuccessful = if (!fullData.getLastVersion()!!.apkSHA.isNullOrEmpty()) {
- getApkFileSha1(applicationInfo.getApkOrXapkFile(context[0],fullData,fullData.basicData)) ==
- fullData.getLastVersion()!!.apkSHA
+ if (fullData.packageName == Constants.MICROG_PACKAGE) {
+ verificationSuccessful = true
} else {
- Security.addProvider(BouncyCastleProvider())
- verifyAPKSignature(
- BufferedInputStream(FileInputStream(
- applicationInfo.getApkFile(context[0],
- fullData.basicData).absolutePath)),
- fullData.getLastVersion()!!.signature.byteInputStream(Charsets.UTF_8),
- context[0].assets.open("f-droid.org-signing-key.gpg"))
+ verificationSuccessful = if (!fullData.getLastVersion()!!.apkSHA.isNullOrEmpty()) {
+ getApkFileSha1(applicationInfo.getApkOrXapkFile(context[0], fullData, fullData.basicData)) ==
+ fullData.getLastVersion()!!.apkSHA
+ } else {
+ Security.addProvider(BouncyCastleProvider())
+ verifyAPKSignature(
+ BufferedInputStream(FileInputStream(
+ applicationInfo.getApkFile(context[0],
+ fullData.basicData).absolutePath)),
+ fullData.getLastVersion()!!.signature.byteInputStream(Charsets.UTF_8),
+ context[0].assets.open("f-droid.org-signing-key.gpg"))
+ }
}
return context[0]
}
@@ -64,7 +67,7 @@ class IntegrityVerificationTask(
integrityVerificationCallback.onIntegrityVerified(context, verificationSuccessful)
}
- private fun getApkFileSha1(file: File): String?{
+ private fun getApkFileSha1(file: File): String? {
val messageDigest = MessageDigest.getInstance("SHA-1")
val fileInputStream = FileInputStream(file)
var length = 0
@@ -77,6 +80,7 @@ class IntegrityVerificationTask(
}
return byteArrayToHex(messageDigest.digest())
}
+
private fun byteArrayToHex(a: ByteArray): String? {
val sb = StringBuilder(a.size * 2)
for (b in a) sb.append(String.format("%02x", b))
@@ -88,43 +92,43 @@ class IntegrityVerificationTask(
apkSignatureInputStream: InputStream,
publicKeyInputStream: InputStream): Boolean {
- var jcaPGPObjectFactory =
- JcaPGPObjectFactory(PGPUtil.getDecoderStream(apkSignatureInputStream))
- val pgpSignatureList: PGPSignatureList
+ var jcaPGPObjectFactory =
+ JcaPGPObjectFactory(PGPUtil.getDecoderStream(apkSignatureInputStream))
+ val pgpSignatureList: PGPSignatureList
- val pgpObject = jcaPGPObjectFactory.nextObject()
- if (pgpObject is PGPCompressedData) {
- jcaPGPObjectFactory = JcaPGPObjectFactory(pgpObject.dataStream)
- pgpSignatureList = jcaPGPObjectFactory.nextObject() as PGPSignatureList
- } else {
- pgpSignatureList = pgpObject as PGPSignatureList
- }
+ val pgpObject = jcaPGPObjectFactory.nextObject()
+ if (pgpObject is PGPCompressedData) {
+ jcaPGPObjectFactory = JcaPGPObjectFactory(pgpObject.dataStream)
+ pgpSignatureList = jcaPGPObjectFactory.nextObject() as PGPSignatureList
+ } else {
+ pgpSignatureList = pgpObject as PGPSignatureList
+ }
- val pgpPublicKeyRingCollection =
- PGPPublicKeyRingCollection(
- PGPUtil.getDecoderStream(publicKeyInputStream),
- JcaKeyFingerprintCalculator())
+ val pgpPublicKeyRingCollection =
+ PGPPublicKeyRingCollection(
+ PGPUtil.getDecoderStream(publicKeyInputStream),
+ JcaKeyFingerprintCalculator())
- val signature = pgpSignatureList.get(0)
- val key = pgpPublicKeyRingCollection.getPublicKey(signature.keyID)
+ val signature = pgpSignatureList.get(0)
+ val key = pgpPublicKeyRingCollection.getPublicKey(signature.keyID)
- signature.init(BcPGPContentVerifierBuilderProvider(), key)
+ signature.init(BcPGPContentVerifierBuilderProvider(), key)
- val buff = ByteArray(1024)
- var read = apkInputStream.read(buff)
- while (read != -1) {
- signature.update(buff, 0, read)
- read = apkInputStream.read(buff)
- }
+ val buff = ByteArray(1024)
+ var read = apkInputStream.read(buff)
+ while (read != -1) {
+ signature.update(buff, 0, read)
+ read = apkInputStream.read(buff)
+ }
- apkInputStream.close()
- apkSignatureInputStream.close()
- publicKeyInputStream.close()
+ apkInputStream.close()
+ apkSignatureInputStream.close()
+ publicKeyInputStream.close()
- return signature.verify()
+ return signature.verify()
- }
}
+}
interface IntegrityVerificationCallback {
fun onIntegrityVerified(context: Context, verificationSuccessful: Boolean)
diff --git a/app/src/main/java/foundation/e/apps/application/model/StateManager.kt b/app/src/main/java/foundation/e/apps/application/model/StateManager.kt
index 556db86b1168998adc87c4935e3b497b0ac5cd42..d4183ec191adbd70c35bc9c50f40d655bf98fc40 100644
--- a/app/src/main/java/foundation/e/apps/application/model/StateManager.kt
+++ b/app/src/main/java/foundation/e/apps/application/model/StateManager.kt
@@ -18,60 +18,98 @@
package foundation.e.apps.application.model
import android.content.Context
+import android.util.Log
+import foundation.e.apps.R
import foundation.e.apps.application.model.data.BasicData
import foundation.e.apps.application.model.data.SearchAppsBasicData
import foundation.e.apps.applicationmanager.ApplicationManager
+import foundation.e.apps.utils.Constants
import foundation.e.apps.utils.Error
+import foundation.e.apps.utils.PreferenceStorage
import java.util.*
class StateManager(private val info: ApplicationInfo, private val app: Application, private val appManager: ApplicationManager) {
private var listeners = Collections.synchronizedList(ArrayList())
+
var state = State.NOT_DOWNLOADED
private set
fun find(context: Context, basicData: BasicData) {
+ if (basicData.name == Constants.MICROG) {
+ Log.e("MicroGStatus", PreferenceStorage(context).getBoolean(context.getString(R.string.prefs_microg_vrsn_installed), false).toString())
+ val state = if (appManager.isInstalling(app) && !app.isInstalling) {
+ State.DOWNLOADING
+ } else if (appManager.isInstalling(app) && app.isInstalling) {
+ State.INSTALLING
+ } else if (PreferenceStorage(context).getBoolean(context.getString(R.string.prefs_microg_vrsn_installed), false)) {
+ if (info.isLastVersionInstalled(context, basicData.lastVersionNumber ?: "")) {
+ State.NOT_UPDATED
+ } else {
+ State.INSTALLED
+ }
+ } else {
+ State.NOT_DOWNLOADED // not installed
+ }
+ changeState(state)
+ } else {
+ val state = if (appManager.isInstalling(app) && !app.isInstalling) {
+ State.DOWNLOADING
+ } else if (appManager.isInstalling(app) && app.isInstalling) {
+ State.INSTALLING
+ } else if (info.isLastVersionInstalled(context,
+ basicData.getLastVersion() ?: "")) {
+ State.INSTALLED
+ } else if (info.isInstalled(context) && !info.isLastVersionInstalled(context,
+ basicData.getLastVersion() ?: "")) {
+ State.NOT_UPDATED
+ } else {
+ State.NOT_DOWNLOADED
+ }
+ changeState(state)
+ }
+ }
+
+ fun findSystemApp(context: Context, basicData: BasicData) {
val state = if (appManager.isInstalling(app) && !app.isInstalling) {
State.DOWNLOADING
} else if (appManager.isInstalling(app) && app.isInstalling) {
State.INSTALLING
- } else if (info.isLastVersionInstalled(context,
- basicData.getLastVersion() ?: "")) {
- State.INSTALLED
- } else if (info.isInstalled(context) && !info.isLastVersionInstalled(context,
- basicData.getLastVersion() ?: "")) {
- State.NOT_UPDATED
+ } else if (PreferenceStorage(context).getBoolean(context.getString(R.string.prefs_microg_vrsn_installed), false)) {
+ if (info.isLastVersionInstalled(context, basicData.lastVersionNumber ?: "")) {
+ State.NOT_UPDATED
+ } else {
+ State.INSTALLED
+ }
} else {
State.NOT_DOWNLOADED
}
changeState(state)
}
-
fun searchAppsFind(context: Context, basicData: SearchAppsBasicData) {
val state = if (appManager.isInstalling(app) && !app.isInstalling) {
State.DOWNLOADING
} else if (appManager.isInstalling(app) && app.isInstalling) {
State.INSTALLING
- } else if(info.isLastVersionInstalled(context,
- basicData.getLastVersion() ?: "")){
+ } else if (info.isLastVersionInstalled(context,
+ basicData.getLastVersion() ?: "")) {
State.INSTALLED
} else if (info.isInstalled(context) && !info.isLastVersionInstalled(context,
basicData.getLastVersion() ?: "")) {
State.NOT_UPDATED
- }
- else {
+ } else {
State.NOT_DOWNLOADED
}
changeState(state)
}
+
fun pwaFind() {
val state = if (appManager.isInstalling(app) && !app.isInstalling) {
State.DOWNLOADING
} else if (appManager.isInstalling(app) && app.isInstalling) {
State.INSTALLING
- }
- else {
+ } else {
State.NOT_DOWNLOADED
}
changeState(state)
diff --git a/app/src/main/java/foundation/e/apps/application/model/data/BasicData.kt b/app/src/main/java/foundation/e/apps/application/model/data/BasicData.kt
index cfdb17afe5336edbccb5638dfb181c6af8f5ab4c..ef5461b6202275335624e8a84020d20b4c0ed184 100644
--- a/app/src/main/java/foundation/e/apps/application/model/data/BasicData.kt
+++ b/app/src/main/java/foundation/e/apps/application/model/data/BasicData.kt
@@ -55,12 +55,13 @@ constructor(@param:JsonProperty("_id") val id: String,
@param:JsonProperty("armeabi-v7a_latest_version_code") var armeabi_v7a_lastVersionCode: Long = -1,
@param:JsonProperty("architectures") val apkArchitecture: ArrayList?,
@param:JsonProperty("author") val author: String,
- @param:JsonProperty("icon_image_path") private val iconUri: String,
+ @param:JsonProperty("icon_image_path") val iconUri: String,
@param:JsonProperty("other_images_path") val imagesUri: Array,
@param:JsonProperty("exodus_score") val privacyRating: Float?,
@param:JsonProperty("ratings") val ratings: Ratings,
@param:JsonProperty("category") val category: String,
- @param:JsonProperty("is_pwa") val is_pwa: Boolean){
+ @param:JsonProperty("is_pwa") val is_pwa: Boolean,
+ var downloadUrl: String? = null) {
private var icon: Bitmap? = null
@@ -102,11 +103,32 @@ constructor(@param:JsonProperty("_id") val id: String,
}
}
+ fun loadSystemAppIconAsync(application: Application, iconLoaderCallback: IconLoaderCallback) {
+ if (icon == null) {
+ var error: Error? = null
+ Execute({
+ error = loadIconSynced()
+ }, {
+ if (error == null) {
+ icon?.let {
+ iconLoaderCallback.onIconLoaded(application, it)
+ }
+ }
+ })
+ } else {
+ iconLoaderCallback.onIconLoaded(application, icon!!)
+ }
+ }
+
@Synchronized
private fun loadIconSynced(): Error? {
if (icon == null) {
try {
- val url = URL(BASE_URL + "media/" + iconUri)
+ var url = URL(BASE_URL + "media/" + iconUri)
+
+ if (iconUri.contains("http"))
+ url = URL(iconUri)
+
val urlConnection = url.openConnection() as HttpsURLConnection
urlConnection.requestMethod = Constants.REQUEST_METHOD_GET
urlConnection.connectTimeout = Constants.CONNECT_TIMEOUT
@@ -138,11 +160,11 @@ constructor(@param:JsonProperty("_id") val id: String,
}
fun getLastVersion(): String? {
- if(apkArchitecture!=null) {
+ if (apkArchitecture != null) {
//An ordered list of ABIs supported by this device. The most preferred ABI is the first element in the list.
val arch = android.os.Build.SUPPORTED_ABIS.toList()
- when(arch[0]) {
+ when (arch[0]) {
"arm64-v8a" -> {
return largestVersion(Pair(arm64_v8a_lastVersionNumber, arm64_v8a_lastVersionCode),
Pair(armeabi_v7a_lastVersionNumber, armeabi_v7a_lastVersionCode),
@@ -192,6 +214,4 @@ constructor(@param:JsonProperty("_id") val id: String,
}
-
-
}
diff --git a/app/src/main/java/foundation/e/apps/application/model/data/FullData.kt b/app/src/main/java/foundation/e/apps/application/model/data/FullData.kt
index a2786ec4ff3f0be946522b9208b770fddf015835..62d58568f4cec5d23bc04b7e2749071192505658 100644
--- a/app/src/main/java/foundation/e/apps/application/model/data/FullData.kt
+++ b/app/src/main/java/foundation/e/apps/application/model/data/FullData.kt
@@ -26,9 +26,9 @@ import foundation.e.apps.categories.model.Category
class FullData @JsonCreator
constructor(
@JsonProperty("_id") id: String,
- @JsonProperty("name") name: String,
+ @JsonProperty("name") var name: String,
@JsonProperty("package_name") packageName: String,
- @JsonProperty("latest_version_number") latestVersionNumber: String,
+ @JsonProperty("latest_version_number") var latestVersionNumber: String,
@JsonProperty("latest_version_code") lastVersionCode: Long,
@JsonProperty("latest_downloaded_version") latestDownloadableUpdate: String,
@JsonProperty("x86_64_latest_downloaded_version") val x86_64_latestDownloadableUpdate: String = "-1",
@@ -54,21 +54,22 @@ constructor(
@JsonProperty("description") val description: String,
@JsonProperty("licence") val licence: String,
@JsonProperty("ratings") ratings: BasicData.Ratings?,
- @JsonProperty("is_pwa ") val is_pwa: Boolean){
+ @JsonProperty("is_pwa ") val is_pwa: Boolean,
+ var downloadUrl: String? = null) {
var basicData = if (ratings == null) {
- BasicData(id, name,packageName, latestVersionNumber,lastVersionCode, latestDownloadableUpdate,
- x86_64_latestDownloadableUpdate,x86_64_lastVersionNumber,x86_64_lastVersionCode,armeabi_latestDownloadableUpdate,
- armeabi_lastVersionNumber,armeabi_lastVersionCode,arm64_v8a_latest_latestDownloadableUpdate,arm64_v8a_lastVersionNumber,arm64_v8a_lastVersionCode,
- x86_latestDownloadableUpdate,x86_lastVersionNumber,x86_lastVersionCode,armeabi_v7a_latestDownloadableUpdate,armeabi_v7a_lastVersionNumber,armeabi_v7a_lastVersionCode,apkArchitecture,
- author,iconUri, imagesUri, null,BasicData.Ratings(-1f, -1f), categoryId,is_pwa)
+ BasicData(id, name, packageName, latestVersionNumber, lastVersionCode, latestDownloadableUpdate,
+ x86_64_latestDownloadableUpdate, x86_64_lastVersionNumber, x86_64_lastVersionCode, armeabi_latestDownloadableUpdate,
+ armeabi_lastVersionNumber, armeabi_lastVersionCode, arm64_v8a_latest_latestDownloadableUpdate, arm64_v8a_lastVersionNumber, arm64_v8a_lastVersionCode,
+ x86_latestDownloadableUpdate, x86_lastVersionNumber, x86_lastVersionCode, armeabi_v7a_latestDownloadableUpdate, armeabi_v7a_lastVersionNumber, armeabi_v7a_lastVersionCode, apkArchitecture,
+ author, iconUri, imagesUri, null, BasicData.Ratings(-1f, -1f), categoryId, is_pwa)
} else {
- BasicData(id, name,packageName, latestVersionNumber,lastVersionCode, latestDownloadableUpdate,
- x86_64_latestDownloadableUpdate,x86_64_lastVersionNumber,x86_64_lastVersionCode,armeabi_latestDownloadableUpdate,
- armeabi_lastVersionNumber,armeabi_lastVersionCode,arm64_v8a_latest_latestDownloadableUpdate,arm64_v8a_lastVersionNumber,arm64_v8a_lastVersionCode,
- x86_latestDownloadableUpdate,x86_lastVersionNumber,x86_lastVersionCode,armeabi_v7a_latestDownloadableUpdate,armeabi_v7a_lastVersionNumber,armeabi_v7a_lastVersionCode,apkArchitecture,
- author,iconUri, imagesUri, ratings.privacyRating, ratings, categoryId,is_pwa)
+ BasicData(id, name, packageName, latestVersionNumber, lastVersionCode, latestDownloadableUpdate,
+ x86_64_latestDownloadableUpdate, x86_64_lastVersionNumber, x86_64_lastVersionCode, armeabi_latestDownloadableUpdate,
+ armeabi_lastVersionNumber, armeabi_lastVersionCode, arm64_v8a_latest_latestDownloadableUpdate, arm64_v8a_lastVersionNumber, arm64_v8a_lastVersionCode,
+ x86_latestDownloadableUpdate, x86_lastVersionNumber, x86_lastVersionCode, armeabi_v7a_latestDownloadableUpdate, armeabi_v7a_lastVersionNumber, armeabi_v7a_lastVersionCode, apkArchitecture,
+ author, iconUri, imagesUri, ratings.privacyRating, ratings, categoryId, is_pwa)
}
var latestVersion: Version? = null;
diff --git a/app/src/main/java/foundation/e/apps/application/model/release/Assets.kt b/app/src/main/java/foundation/e/apps/application/model/release/Assets.kt
new file mode 100644
index 0000000000000000000000000000000000000000..e1345e5ce09a85847f61835015a5634efb8a8a71
--- /dev/null
+++ b/app/src/main/java/foundation/e/apps/application/model/release/Assets.kt
@@ -0,0 +1,12 @@
+package foundation.e.apps.application.model.release
+
+import com.google.gson.annotations.SerializedName
+import foundation.e.apps.application.model.release.Sources
+
+data class Assets (
+
+ @SerializedName("count") val count : Int,
+ @SerializedName("sources") val sources : List,
+ @SerializedName("links") val links : List,
+ @SerializedName("evidence_file_path") val evidence_file_path : String
+)
\ No newline at end of file
diff --git a/app/src/main/java/foundation/e/apps/application/model/release/Author.kt b/app/src/main/java/foundation/e/apps/application/model/release/Author.kt
new file mode 100644
index 0000000000000000000000000000000000000000..ad1a48fd29865dd2833e028359df950f638f9cb3
--- /dev/null
+++ b/app/src/main/java/foundation/e/apps/application/model/release/Author.kt
@@ -0,0 +1,14 @@
+package foundation.e.apps.application.model.release
+
+import com.google.gson.annotations.SerializedName
+
+
+data class Author (
+
+ @SerializedName("id") val id : Int=-1,
+ @SerializedName("name") val name : String="",
+ @SerializedName("username") val username : String="",
+ @SerializedName("state") val state : String="",
+ @SerializedName("avatar_url") val avatar_url : String="",
+ @SerializedName("web_url") val web_url : String
+)
\ No newline at end of file
diff --git a/app/src/main/java/foundation/e/apps/application/model/release/Commit.kt b/app/src/main/java/foundation/e/apps/application/model/release/Commit.kt
new file mode 100644
index 0000000000000000000000000000000000000000..14d1697615319e92bf5b2d0de3556a12d7558777
--- /dev/null
+++ b/app/src/main/java/foundation/e/apps/application/model/release/Commit.kt
@@ -0,0 +1,21 @@
+package foundation.e.apps.application.model.release
+
+import com.google.gson.annotations.SerializedName
+
+
+data class Commit (
+
+ @SerializedName("id") val id : String,
+ @SerializedName("short_id") val short_id : String,
+ @SerializedName("created_at") val created_at : String,
+ @SerializedName("parent_ids") val parent_ids : List,
+ @SerializedName("title") val title : String,
+ @SerializedName("message") val message : String,
+ @SerializedName("author_name") val author_name : String,
+ @SerializedName("author_email") val author_email : String,
+ @SerializedName("authored_date") val authored_date : String,
+ @SerializedName("committer_name") val committer_name : String,
+ @SerializedName("committer_email") val committer_email : String,
+ @SerializedName("committed_date") val committed_date : String,
+ @SerializedName("web_url") val web_url : String
+)
\ No newline at end of file
diff --git a/app/src/main/java/foundation/e/apps/application/model/release/Evidences.kt b/app/src/main/java/foundation/e/apps/application/model/release/Evidences.kt
new file mode 100644
index 0000000000000000000000000000000000000000..c910b241eaf66b7e0a4cf42070e8d0862ddafc3d
--- /dev/null
+++ b/app/src/main/java/foundation/e/apps/application/model/release/Evidences.kt
@@ -0,0 +1,11 @@
+package foundation.e.apps.application.model.release
+
+import com.google.gson.annotations.SerializedName
+
+
+data class Evidences (
+
+ @SerializedName("sha") val sha : String,
+ @SerializedName("filepath") val filepath : String,
+ @SerializedName("collected_at") val collected_at : String
+)
\ No newline at end of file
diff --git a/app/src/main/java/foundation/e/apps/application/model/release/Links.kt b/app/src/main/java/foundation/e/apps/application/model/release/Links.kt
new file mode 100644
index 0000000000000000000000000000000000000000..c49360291b88ec56535231ca6fe9b993c84e32ef
--- /dev/null
+++ b/app/src/main/java/foundation/e/apps/application/model/release/Links.kt
@@ -0,0 +1,11 @@
+package foundation.e.apps.application.model.release
+
+import com.google.gson.annotations.SerializedName
+
+data class Links(
+ @field:SerializedName("id") val id: Int,
+ @field:SerializedName("name") val name: String,
+ @field:SerializedName("url") val url: String,
+ @field:SerializedName("direct_asset_url") val direct_asset_url: String,
+ @field:SerializedName("external") val external: String
+)
\ No newline at end of file
diff --git a/app/src/main/java/foundation/e/apps/application/model/release/ReleaseData.kt b/app/src/main/java/foundation/e/apps/application/model/release/ReleaseData.kt
new file mode 100644
index 0000000000000000000000000000000000000000..836861989535624b811cbf98852b0f93f7aae435
--- /dev/null
+++ b/app/src/main/java/foundation/e/apps/application/model/release/ReleaseData.kt
@@ -0,0 +1,21 @@
+package foundation.e.apps.application.model.release
+
+import com.google.gson.annotations.SerializedName
+
+
+class ReleaseData(
+ @SerializedName("name") val name: String,
+ @SerializedName("tag_name") val tag_name: String,
+ @SerializedName("description") val description: String,
+ @SerializedName("description_html") val description_html: String,
+ @SerializedName("created_at") val created_at: String,
+ @SerializedName("released_at") val released_at: String,
+ @SerializedName("author") val author: Author,
+ @SerializedName("commit") val commit: Commit,
+ @SerializedName("assets") val assets: Assets,
+ @SerializedName("upcoming_release") val upcoming_release: Boolean,
+ @SerializedName("commit_path") val commit_path: String,
+ @SerializedName("tag_path") val tag_path: String,
+ @SerializedName("evidence_sha") val evidence_sha: String,
+ @SerializedName("evidences") val evidences: List
+)
\ No newline at end of file
diff --git a/app/src/main/java/foundation/e/apps/application/model/release/Sources.kt b/app/src/main/java/foundation/e/apps/application/model/release/Sources.kt
new file mode 100644
index 0000000000000000000000000000000000000000..8444ed18adfe795607c3a1d6c4dfc76975a11b0c
--- /dev/null
+++ b/app/src/main/java/foundation/e/apps/application/model/release/Sources.kt
@@ -0,0 +1,10 @@
+package foundation.e.apps.application.model.release
+
+import com.google.gson.annotations.SerializedName
+
+
+data class Sources (
+
+ @SerializedName("format") val format : String,
+ @SerializedName("url") val url : String
+)
\ No newline at end of file
diff --git a/app/src/main/java/foundation/e/apps/application/model/release/_links.kt b/app/src/main/java/foundation/e/apps/application/model/release/_links.kt
new file mode 100644
index 0000000000000000000000000000000000000000..fec4878db72d463e6ee4299aa7396a8ea560dd5a
--- /dev/null
+++ b/app/src/main/java/foundation/e/apps/application/model/release/_links.kt
@@ -0,0 +1,10 @@
+package foundation.e.apps.application.model.release
+
+import com.google.gson.annotations.SerializedName
+
+
+data class _links (
+
+ @SerializedName("self") val self : String,
+ @SerializedName("edit_url") val edit_url : String
+)
\ No newline at end of file
diff --git a/app/src/main/java/foundation/e/apps/categories/ApplicationsFragment.kt b/app/src/main/java/foundation/e/apps/categories/ApplicationsFragment.kt
index ffe58a5fd676be67c1a3388f6edcac235fe5f102..5547f495e16d9edcea3b5aaba68d2fd3ae760f29 100644
--- a/app/src/main/java/foundation/e/apps/categories/ApplicationsFragment.kt
+++ b/app/src/main/java/foundation/e/apps/categories/ApplicationsFragment.kt
@@ -17,7 +17,6 @@
package foundation.e.apps.categories
-import android.graphics.Color
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
@@ -28,15 +27,14 @@ import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.LinearLayoutManager
import foundation.e.apps.R
+import foundation.e.apps.categories.model.Category
import foundation.e.apps.categories.viewmodel.CategoriesViewModel
import kotlinx.android.synthetic.main.error_layout.view.*
import kotlinx.android.synthetic.main.fragment_application_categories.view.*
-class ApplicationsFragment(color: Int?) : Fragment() {
+class ApplicationsFragment : Fragment() {
private lateinit var categoriesViewModel: CategoriesViewModel
- val color = color;
-
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
categoriesViewModel = ViewModelProviders.of(activity!!).get(CategoriesViewModel::class.java)
@@ -51,16 +49,13 @@ class ApplicationsFragment(color: Int?) : Fragment() {
categoriesViewModel.loadCategories(context!!)
}
- view.error_resolve.setTextColor(Color.parseColor("#ffffff"))
- if (color != null) {
- view.error_resolve.setBackgroundColor(color)
- }
-
// Bind to the list of applications categories
categoriesViewModel.getApplicationsCategories().observe(this, Observer {
if (it!!.isNotEmpty()) {
+ //Add New Category
+ it.add(Category("system_apps"))
- view.categories_list.adapter = CategoriesListAdapter(it, color)
+ view.categories_list.adapter = CategoriesListAdapter(it)
view.categories_list.visibility = View.VISIBLE
view.progress_bar.visibility = View.GONE
}
diff --git a/app/src/main/java/foundation/e/apps/categories/CategoriesFragment.kt b/app/src/main/java/foundation/e/apps/categories/CategoriesFragment.kt
index d202b2b2bb85a7f17027dace549ff567994848c8..aa80032b8d0b05979ab10129f7d4bc65dafc5e1a 100644
--- a/app/src/main/java/foundation/e/apps/categories/CategoriesFragment.kt
+++ b/app/src/main/java/foundation/e/apps/categories/CategoriesFragment.kt
@@ -17,16 +17,10 @@
package foundation.e.apps.categories
-import android.content.Context
-import android.graphics.Color
import android.os.Bundle
-import android.util.Log
-import android.util.TypedValue
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
-import androidx.annotation.ColorInt
-import androidx.appcompat.view.ContextThemeWrapper
import androidx.fragment.app.Fragment
import androidx.viewpager.widget.ViewPager
import com.google.android.material.tabs.TabLayout
@@ -34,26 +28,17 @@ import foundation.e.apps.R
class CategoriesFragment : Fragment() {
-
-
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.fragment_categories, container, false)
val tabLayout = view.findViewById(R.id.tab_layout)
val viewPager = view.findViewById(R.id.view_pager)
- var color = getAccentColor(activity!!);
- viewPager.adapter = CategoriesViewPagerAdapter(activity!!.supportFragmentManager, tabLayout.tabCount, color)
- viewPager.addOnPageChangeListener(TabLayout.TabLayoutOnPageChangeListener(tabLayout))
- if (color != null) {
- tabLayout.setSelectedTabIndicatorColor(color);
- tabLayout.setTabTextColors(Color.parseColor("#000000"), color);
-
- };
+ viewPager.adapter = CategoriesViewPagerAdapter(activity!!.supportFragmentManager, tabLayout.tabCount)
+ viewPager.addOnPageChangeListener(TabLayout.TabLayoutOnPageChangeListener(tabLayout))
tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab) {
viewPager.currentItem = tab.position
-
}
override fun onTabUnselected(tab: TabLayout.Tab) {
@@ -66,17 +51,4 @@ class CategoriesFragment : Fragment() {
})
return view
}
-
- /*
- * get Accent color from OS
- *
- */
- fun getAccentColor(context: Context): Int {
-
- val color =context.resources.getColor(R.color.colorAccent);
-
-
- return color;
-
- }
}
diff --git a/app/src/main/java/foundation/e/apps/categories/CategoriesListAdapter.kt b/app/src/main/java/foundation/e/apps/categories/CategoriesListAdapter.kt
index 72f300ccd76573d37d5196bafc9adff8fca24246..766d5b532ae986dd3eaea72d9859f4850a3d9d07 100644
--- a/app/src/main/java/foundation/e/apps/categories/CategoriesListAdapter.kt
+++ b/app/src/main/java/foundation/e/apps/categories/CategoriesListAdapter.kt
@@ -32,14 +32,12 @@ import foundation.e.apps.categories.category.CategoryActivity
import foundation.e.apps.categories.model.Category
import foundation.e.apps.utils.Constants
-class CategoriesListAdapter(private var categories: ArrayList, color: Int?)
+class CategoriesListAdapter(private var categories: ArrayList)
: RecyclerView.Adapter() {
- val color = color;
init {
categories = ArrayList(categories.sortedWith(
compareBy({ it.getTitle() }, { it.getTitle() })))
-
}
class CategoryViewHolder(view: View) : RecyclerView.ViewHolder(view) {
@@ -64,15 +62,12 @@ class CategoriesListAdapter(private var categories: ArrayList, color:
holder.categoryIcon.setImageDrawable(holder.categoryIcon.resources.getDrawable(categories[position].getIconResource()))
- //holder.categoryIcon.setColorFilter(Color.parseColor("#0088ED"))
- if (color != null) {
- holder.categoryIcon.setColorFilter(color)
- }
+ holder.categoryIcon.setColorFilter(Color.parseColor("#0088ED"))
holder.categoryTitle.text = categories[position].getTitle()
holder.categoryContainer.setOnClickListener {
val intent = Intent(holder.categoryContainer.context, CategoryActivity::class.java)
intent.putExtra(Constants.CATEGORY_KEY, categories[position])
- intent.putExtra("POSITION",position)
+ intent.putExtra("POSITION", position)
holder.categoryContainer.context.startActivity(intent)
}
}
diff --git a/app/src/main/java/foundation/e/apps/categories/CategoriesViewPagerAdapter.kt b/app/src/main/java/foundation/e/apps/categories/CategoriesViewPagerAdapter.kt
index 043ad5036f521d40c9dc1e7084e5c0c4b39fb1ab..5af8588f8ac973af9e90a89f83f7b41ef1a55610 100644
--- a/app/src/main/java/foundation/e/apps/categories/CategoriesViewPagerAdapter.kt
+++ b/app/src/main/java/foundation/e/apps/categories/CategoriesViewPagerAdapter.kt
@@ -21,11 +21,11 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentStatePagerAdapter
-class CategoriesViewPagerAdapter(fragmentManager: FragmentManager, private val numberOfTabs: Int, color: Int?) :
+class CategoriesViewPagerAdapter(fragmentManager: FragmentManager, private val numberOfTabs: Int) :
FragmentStatePagerAdapter(fragmentManager) {
- private val applicationsFragment = ApplicationsFragment(color)
- private val gamesFragment = GamesFragment(color)
+ private val applicationsFragment = ApplicationsFragment()
+ private val gamesFragment = GamesFragment()
private val pwasFragment = PwasFragment()
diff --git a/app/src/main/java/foundation/e/apps/categories/GamesFragment.kt b/app/src/main/java/foundation/e/apps/categories/GamesFragment.kt
index 34dc4dd6f4b72149bf8ac208649fc6237a72350f..da4155bc239526ac7b42614f669d6b0009c3b575 100644
--- a/app/src/main/java/foundation/e/apps/categories/GamesFragment.kt
+++ b/app/src/main/java/foundation/e/apps/categories/GamesFragment.kt
@@ -17,7 +17,6 @@
package foundation.e.apps.categories
-import android.graphics.Color
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
@@ -32,11 +31,9 @@ import foundation.e.apps.categories.viewmodel.CategoriesViewModel
import kotlinx.android.synthetic.main.error_layout.view.*
import kotlinx.android.synthetic.main.fragment_games_categories.view.*
-class GamesFragment(color: Int?) : Fragment() {
+class GamesFragment : Fragment() {
private lateinit var categoriesViewModel: CategoriesViewModel
- var color=color;
-
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
categoriesViewModel = ViewModelProviders.of(activity!!).get(CategoriesViewModel::class.java)
@@ -50,16 +47,11 @@ class GamesFragment(color: Int?) : Fragment() {
view.progress_bar.visibility = View.VISIBLE
categoriesViewModel.loadCategories(context!!)
}
- view.error_resolve.setTextColor(Color.parseColor("#ffffff"))
- if (color != null) {
- view.error_resolve.setBackgroundColor(color!!)
- }
-
// Bind to the list of games categories
categoriesViewModel.getGamesCategories().observe(this, Observer {
if (it!!.isNotEmpty()) {
- view.categories_list.adapter = CategoriesListAdapter(it, color)
+ view.categories_list.adapter = CategoriesListAdapter(it)
view.categories_list.visibility = View.VISIBLE
view.progress_bar.visibility = View.GONE
}
diff --git a/app/src/main/java/foundation/e/apps/categories/PwasFragment.kt b/app/src/main/java/foundation/e/apps/categories/PwasFragment.kt
index 260dacd830fc748fd5de5003adc12fe194bc3273..c98e1294d81b16c699076c379304c6fd09524239 100644
--- a/app/src/main/java/foundation/e/apps/categories/PwasFragment.kt
+++ b/app/src/main/java/foundation/e/apps/categories/PwasFragment.kt
@@ -34,7 +34,7 @@ class PwasFragment : Fragment() {
// Bind to the list of pwas categories
categoriesViewModel.getPwasCategories().observe(this, Observer {
if (it!!.isNotEmpty()) {
- view.categories_list.adapter = CategoriesListAdapter(it, null)
+ view.categories_list.adapter = CategoriesListAdapter(it)
view.categories_list.visibility = View.VISIBLE
view.progress_bar.visibility = View.GONE
}
diff --git a/app/src/main/java/foundation/e/apps/categories/category/CategoryActivity.kt b/app/src/main/java/foundation/e/apps/categories/category/CategoryActivity.kt
index 5a3745fffeda03b3e33a3f089220d09236db4549..204766e38a7e24153468b69ca753ec95f582d51d 100644
--- a/app/src/main/java/foundation/e/apps/categories/category/CategoryActivity.kt
+++ b/app/src/main/java/foundation/e/apps/categories/category/CategoryActivity.kt
@@ -18,25 +18,20 @@
package foundation.e.apps.categories.category
import android.content.pm.PackageManager
-import android.graphics.Color
import android.os.Bundle
-import android.util.TypedValue
import android.view.MenuItem
import android.view.View
import android.widget.LinearLayout
import android.widget.ProgressBar
import android.widget.RelativeLayout
import android.widget.TextView
-import androidx.annotation.ColorInt
import androidx.appcompat.app.AppCompatActivity
-import androidx.appcompat.view.ContextThemeWrapper
import androidx.appcompat.widget.Toolbar
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.snackbar.Snackbar
-import foundation.e.apps.MainActivity
import foundation.e.apps.R
import foundation.e.apps.application.model.Application
import foundation.e.apps.applicationmanager.ApplicationManager
@@ -48,7 +43,6 @@ import foundation.e.apps.common.ApplicationListAdapter
import foundation.e.apps.utils.Constants
import foundation.e.apps.utils.Constants.CATEGORY_KEY
import kotlinx.android.synthetic.main.activity_category.*
-import kotlinx.android.synthetic.main.error_layout.*
class CategoryActivity : AppCompatActivity(), ApplicationManagerServiceConnectionCallback {
@@ -60,7 +54,7 @@ class CategoryActivity : AppCompatActivity(), ApplicationManagerServiceConnectio
ApplicationManagerServiceConnection(this)
private var applicationList = ArrayList()
private var isLoadingMoreApplications = false
- var accentColorOS=0;
+
override fun onCreate(savedInstanceState: Bundle?) {
@@ -81,11 +75,6 @@ class CategoryActivity : AppCompatActivity(), ApplicationManagerServiceConnectio
val errorContainer = findViewById(R.id.error_container)
val errorDescription = findViewById(R.id.error_description)
- //set accent color to Error button (Retry )
- findViewById(R.id.error_resolve).setTextColor(Color.parseColor("#ffffff"))
- findViewById(R.id.error_resolve).setBackgroundColor(accentColorOS)
-
-
// Initialise UI elements
recyclerView.visibility = View.GONE
loadMoreContainer.visibility = View.GONE
@@ -94,10 +83,10 @@ class CategoryActivity : AppCompatActivity(), ApplicationManagerServiceConnectio
if (!recyclerView.canScrollVertically(1)) {
loadMoreContainer.visibility = View.VISIBLE
recyclerView.scrollToPosition(applicationList.size - 1)
- if (!isLoadingMoreApplications) {
- isLoadingMoreApplications = true
- categoryViewModel.loadApplications(this@CategoryActivity)
- }
+ if (!isLoadingMoreApplications) {
+ isLoadingMoreApplications = true
+ categoryViewModel.loadApplications(this@CategoryActivity)
+ }
} else {
loadMoreContainer.visibility = View.GONE
}
@@ -115,7 +104,7 @@ class CategoryActivity : AppCompatActivity(), ApplicationManagerServiceConnectio
// Initialise recycler view
recyclerView.setHasFixedSize(true)
recyclerView.layoutManager = LinearLayoutManager(this)
- recyclerView.adapter = ApplicationListAdapter(this, applicationList, 0)
+ recyclerView.adapter = ApplicationListAdapter(this, applicationList)
// Bind to the list of applications in this activity's category
categoryViewModel.getApplications().observe(this, Observer {
@@ -194,13 +183,4 @@ class CategoryActivity : AppCompatActivity(), ApplicationManagerServiceConnectio
}
applicationManagerServiceConnection.unbindService(this)
}
-
- /*
- * get Accent color from OS
- *
- * */
- private fun getAccentColor() {
-
- accentColorOS=this.resources.getColor(R.color.colorAccent);
- }
}
diff --git a/app/src/main/java/foundation/e/apps/categories/category/model/CategoryModel.kt b/app/src/main/java/foundation/e/apps/categories/category/model/CategoryModel.kt
index b8ce442a8b4a3ece6bb57ee377b59b7024d6ba74..999be771bf5fac85c4df6bfaef7b2631f65b88fb 100644
--- a/app/src/main/java/foundation/e/apps/categories/category/model/CategoryModel.kt
+++ b/app/src/main/java/foundation/e/apps/categories/category/model/CategoryModel.kt
@@ -22,6 +22,7 @@ import androidx.lifecycle.MutableLiveData
import foundation.e.apps.MainActivity
import foundation.e.apps.api.ListApplicationsRequest
import foundation.e.apps.api.ListPwasRequest
+import foundation.e.apps.api.GitlabDataRequest
import foundation.e.apps.application.model.Application
import foundation.e.apps.applicationmanager.ApplicationManager
import foundation.e.apps.utils.Common
@@ -46,52 +47,91 @@ class CategoryModel : CategoryModelInterface {
override fun loadApplications(context: Context) {
var apps: ArrayList? = null
if (Common.isNetworkAvailable(context)) {
- Execute({
- apps = loadApplicationsSynced(context)
- }, {
- if (error == null && apps != null) {
- val result = ArrayList()
- categoryApplicationsList.value?.let {
- result.addAll(it)
+ if (category == "system_apps") {
+ Execute({
+ apps = loadApplicationsSynced(context)
+ }, {
+ if (error == null && apps != null) {
+ val result = ArrayList()
+ result.addAll(apps!!)
+ if (apps!!.size != 0) {
+ categoryApplicationsList.value = result
+ }
+ } else {
+ screenError.value = error
}
- result.addAll(apps!!)
- if (apps!!.size != 0) {
- categoryApplicationsList.value = result
+ })
+
+ } else {
+
+ Execute({
+ apps = loadApplicationsSynced(context)
+ }, {
+ if (error == null && apps != null) {
+ val result = ArrayList()
+ categoryApplicationsList.value?.let {
+ result.addAll(it)
+ }
+ result.addAll(apps!!)
+ if (apps!!.size != 0) {
+ categoryApplicationsList.value = result
+ }
+ } else {
+ screenError.value = error
}
- } else {
- screenError.value = error
- }
- })
- page++
+ })
+ page++
+ }
} else {
screenError.value = Error.NO_INTERNET
}
}
- fun loadApplicationsSynced(context: Context): ArrayList? {
+ fun loadApplicationsSynced(context: Context): ArrayList? {
var listApplications: ListApplicationsRequest.ListApplicationsResult? = null
+ var gitlabData: GitlabDataRequest.GitlabDataResult? = null
var listPwas: ListPwasRequest.ListPwasResult? = null
- var appType = MainActivity.mActivity.showApplicationTypePreference()
+ val appType = MainActivity.mActivity.showApplicationTypePreference()
+ if (category == "system_apps") {
+ GitlabDataRequest()
+ .requestGmsCoreRelease { applicationError, listGitlabData ->
- if(appType=="pwa"){
- ListPwasRequest(category,page,Constants.RESULTS_PER_PAGE)
- .request { applicationError, listPwasResult ->
- when (applicationError) {
- null -> {
- listPwas = listPwasResult!!
+ when (applicationError) {
+ null -> {
+ gitlabData = listGitlabData!!
+ }
+ else -> {
+ error = applicationError
+ }
}
- else -> {
- error = applicationError
+ }
+ return if (gitlabData != null) {
+ gitlabData!!.getApplications(applicationManager, context)
+ } else {
+ null
+ }
+
+ }
+
+ if (appType == "pwa") {
+ ListPwasRequest(category, page, Constants.RESULTS_PER_PAGE)
+ .request { applicationError, listPwasResult ->
+ when (applicationError) {
+ null -> {
+ listPwas = listPwasResult!!
+ }
+ else -> {
+ error = applicationError
+ }
}
}
- }
return if (listPwas != null) {
listPwas!!.getApplications(applicationManager, context)
} else {
null
}
}
- ListApplicationsRequest(category,page,Constants.RESULTS_PER_PAGE)
+ ListApplicationsRequest(category, page, Constants.RESULTS_PER_PAGE)
.request { applicationError, listApplicationsResult ->
when (applicationError) {
null -> {
@@ -107,6 +147,7 @@ class CategoryModel : CategoryModelInterface {
} else {
null
}
+
}
diff --git a/app/src/main/java/foundation/e/apps/categories/model/Category.kt b/app/src/main/java/foundation/e/apps/categories/model/Category.kt
index 16e0d5b99aa16a6d7497427d63ca57d4a24af140..f19cc271e8be2482beb2b400cbcaf9b872b477dc 100644
--- a/app/src/main/java/foundation/e/apps/categories/model/Category.kt
+++ b/app/src/main/java/foundation/e/apps/categories/model/Category.kt
@@ -31,9 +31,8 @@ class Category(val id: String, val result: String = "") : Serializable {
}
private fun getCategoryTitle(categoryId: String): String {
- if(result.isNotEmpty()) return result
-
- else{
+ if (result.isNotEmpty()) return result
+ else {
val title = categoryId.replace("_", " ")
return title.capitalize()
}
@@ -63,6 +62,8 @@ class Category(val id: String, val result: String = "") : Serializable {
R.drawable.ic_cat_security
"system" ->
R.drawable.ic_cat_system
+ "system_apps" ->
+ R.drawable.ic_cat_system
"communication" ->
R.drawable.ic_cat_communication
"medical" ->
@@ -77,7 +78,7 @@ class Category(val id: String, val result: String = "") : Serializable {
R.drawable.ic_cat_productivity
"house_and_home" ->
R.drawable.ic_cat_house_and_home
- "art_and_design"->
+ "art_and_design" ->
R.drawable.ic_art_and_design
"photography" ->
R.drawable.ic_cat_photography
diff --git a/app/src/main/java/foundation/e/apps/common/ApplicationListAdapter.kt b/app/src/main/java/foundation/e/apps/common/ApplicationListAdapter.kt
index 337dbb1f50a0f133c687e6e4ac01fdb034ddcbe5..9c61792d55257adcb6b610eab24e69c213850c4e 100644
--- a/app/src/main/java/foundation/e/apps/common/ApplicationListAdapter.kt
+++ b/app/src/main/java/foundation/e/apps/common/ApplicationListAdapter.kt
@@ -25,17 +25,15 @@ import foundation.e.apps.R
import foundation.e.apps.application.ApplicationViewHolder
import foundation.e.apps.application.model.Application
-class ApplicationListAdapter(private val activity: Activity, private val applicationList: List, accentColorOS: Int) : RecyclerView.Adapter() {
+class ApplicationListAdapter(private val activity: Activity, private val applicationList: List) : RecyclerView.Adapter() {
-
- var accentColorOS=accentColorOS;
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ApplicationViewHolder {
val listItemContainer = LayoutInflater.from(parent.context).inflate(R.layout.application_list_item, parent, false)
- return ApplicationViewHolder(activity, listItemContainer, accentColorOS)
+ return ApplicationViewHolder(activity, listItemContainer)
}
override fun onBindViewHolder(holder: ApplicationViewHolder, position: Int) {
- holder.createApplicationView(applicationList[position] )
+ holder.createApplicationView(applicationList[position])
}
override fun getItemCount() = applicationList.size
diff --git a/app/src/main/java/foundation/e/apps/home/HomeFragment.kt b/app/src/main/java/foundation/e/apps/home/HomeFragment.kt
index e9c5a1ce255eb781f300a7b1e29300d56ac77db9..723df4b79261345e76dde591803b5697d49e8e35 100644
--- a/app/src/main/java/foundation/e/apps/home/HomeFragment.kt
+++ b/app/src/main/java/foundation/e/apps/home/HomeFragment.kt
@@ -19,12 +19,10 @@ package foundation.e.apps.home
//import java.awt.font.ShapeGraphicAttribute.STROKE
//import java.awt.AlphaComposite.SRC_IN
-import android.graphics.Color
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
-import android.widget.Button
import android.widget.LinearLayout
import android.widget.ProgressBar
import android.widget.TextView
@@ -40,8 +38,6 @@ import foundation.e.apps.applicationmanager.ApplicationManager
import foundation.e.apps.categories.model.Category
import foundation.e.apps.common.SmallApplicationListAdapter
import foundation.e.apps.home.viewmodel.HomeViewModel
-import kotlinx.android.synthetic.main.error_layout.*
-import kotlinx.android.synthetic.main.install_button_layout.*
class HomeFragment : Fragment() {
@@ -51,11 +47,9 @@ class HomeFragment : Fragment() {
private lateinit var categoryList: LinearLayout
private lateinit var progressBar: ProgressBar
private var applicationManager: ApplicationManager? = null
- var accentColorOS=0;
- fun initialise(applicationManager: ApplicationManager, accentColorOS: Int) {
+ fun initialise(applicationManager: ApplicationManager) {
this.applicationManager = applicationManager
- this.accentColorOS=accentColorOS;
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
@@ -65,10 +59,6 @@ class HomeFragment : Fragment() {
}
val view = inflater.inflate(R.layout.fragment_home, container, false)
- /* if(accentColorOS!=0){
-
- view.findViewById(R.id.tv_featured).setTextColor(accentColorOS);
- }*/
homeViewModel = ViewModelProviders.of(activity!!).get(HomeViewModel::class.java)
imageCarousel = view.findViewById(R.id.image_carousel)
@@ -77,10 +67,6 @@ class HomeFragment : Fragment() {
progressBar = view.findViewById(R.id.progress_bar)
val errorContainer = view.findViewById(R.id.error_container)
val errorDescription = view.findViewById(R.id.error_description)
- //set accent color to Error button (Retry )
-
- view.findViewById(R.id.error_resolve).setTextColor(Color.parseColor("#ffffff"))
- view.findViewById(R.id.error_resolve).setBackgroundColor(accentColorOS)
// Initialise UI elements
homeViewModel.initialise(applicationManager!!)
diff --git a/app/src/main/java/foundation/e/apps/search/SearchFragment.kt b/app/src/main/java/foundation/e/apps/search/SearchFragment.kt
index dfadd53bb32b992d7bc54ce71b542209d57597b6..7f4922b279a73f9404f015cdf19c3b2ae4ddbfbc 100644
--- a/app/src/main/java/foundation/e/apps/search/SearchFragment.kt
+++ b/app/src/main/java/foundation/e/apps/search/SearchFragment.kt
@@ -19,7 +19,6 @@ package foundation.e.apps.search
import android.app.Activity
import android.database.MatrixCursor
-import android.graphics.Color
import android.os.Bundle
import android.provider.BaseColumns
import android.view.LayoutInflater
@@ -53,11 +52,9 @@ class SearchFragment : Fragment(), SearchView.OnQueryTextListener, SearchView.On
private var applicationList = ArrayList()
private var applicationManager: ApplicationManager? = null
private var isLoadingMoreApplications = false
- var accentColorOS=0;
- fun initialise(applicationManager: ApplicationManager, accentColorOS: Int) {
+ fun initialise(applicationManager: ApplicationManager) {
this.applicationManager = applicationManager
- this.accentColorOS=accentColorOS;
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
@@ -79,10 +76,6 @@ class SearchFragment : Fragment(), SearchView.OnQueryTextListener, SearchView.On
val errorContainer = view.findViewById(R.id.error_container)
val errorDescription = view.findViewById(R.id.error_description)
val loadMoreContainer = view.findViewById(R.id.load_more_container)
-//set accent color to Error button (Retry )
- error_resolve.setTextColor(Color.parseColor("#ffffff"))
- error_resolve.setBackgroundColor(accentColorOS)
-
error_resolve.visibility=View.GONE
searchViewModel.initialise(applicationManager!!)
@@ -111,7 +104,7 @@ class SearchFragment : Fragment(), SearchView.OnQueryTextListener, SearchView.On
// Initialise recycler view
recyclerView.setHasFixedSize(true)
recyclerView.layoutManager = LinearLayoutManager(context)
- recyclerView.adapter = ApplicationListAdapter(activity!!, applicationList, 0)
+ recyclerView.adapter = ApplicationListAdapter(activity!!, applicationList)
loadMoreContainer.visibility = View.GONE
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
diff --git a/app/src/main/java/foundation/e/apps/search/model/SearchModel.kt b/app/src/main/java/foundation/e/apps/search/model/SearchModel.kt
index 63d01dd44632ca2a0aa82eec05f16dd566b54eea..4b22ca9ad36d466690aacb0afbbf19f5fe5cedce 100644
--- a/app/src/main/java/foundation/e/apps/search/model/SearchModel.kt
+++ b/app/src/main/java/foundation/e/apps/search/model/SearchModel.kt
@@ -18,10 +18,13 @@
package foundation.e.apps.search.model
import android.content.Context
+import android.content.Intent
import android.os.AsyncTask
import androidx.lifecycle.MutableLiveData
import foundation.e.apps.application.model.Application
import foundation.e.apps.applicationmanager.ApplicationManager
+import foundation.e.apps.categories.category.CategoryActivity
+import foundation.e.apps.categories.model.Category
import foundation.e.apps.utils.Common
import foundation.e.apps.utils.Constants
import foundation.e.apps.utils.Error
@@ -34,6 +37,7 @@ class SearchModel : SearchModelInterface {
private var applicationManager: ApplicationManager? = null
private var pageNumber = 0
private lateinit var searchQuery: String
+ private lateinit var context: Context
override fun initialise(applicationManager: ApplicationManager) {
this.applicationManager = applicationManager
@@ -41,6 +45,7 @@ class SearchModel : SearchModelInterface {
override fun searchSuggestions(context: Context, searchQuery: String) {
this.searchQuery = searchQuery
+ this.context=context
if (searchQuery.length >= Constants.MIN_SEARCH_TERM_LENGTH) {
if (Common.isNetworkAvailable(context)) {
SearchSuggestionsTask(searchQuery, applicationManager!!, this)
@@ -79,17 +84,24 @@ class SearchModel : SearchModelInterface {
}
override fun onSearchComplete(error: Error?, applicationList: ArrayList) {
+
if (error == null) {
- if (applicationList.isNotEmpty()) {
- if (pageNumber > 1 && this.applicationList.value != null) {
- val combinedAppList = this.applicationList.value!!
- combinedAppList.addAll(applicationList)
- this.applicationList.value = combinedAppList
+ if (searchQuery.equals("microg", true)) {
+ val categoryIntent = Intent(context, CategoryActivity::class.java)
+ categoryIntent.putExtra(Constants.CATEGORY_KEY, Category("system_apps"))
+ context.startActivity(categoryIntent)
+ } else {
+ if (applicationList.isNotEmpty()) {
+ if (pageNumber > 1 && this.applicationList.value != null) {
+ val combinedAppList = this.applicationList.value!!
+ combinedAppList.addAll(applicationList)
+ this.applicationList.value = combinedAppList
+ } else {
+ this.applicationList.value = applicationList
+ }
} else {
- this.applicationList.value = applicationList
+ screenError.value = Error.NO_RESULTS
}
- } else {
- screenError.value = Error.NO_RESULTS
}
} else {
screenError.value = error
diff --git a/app/src/main/java/foundation/e/apps/settings/SettingsFragment.kt b/app/src/main/java/foundation/e/apps/settings/SettingsFragment.kt
index e51cf53455ceb95e076856da439cd452edeb9ea3..b66033b7e3c8ff7bd05e155d52be736a164dbfe2 100644
--- a/app/src/main/java/foundation/e/apps/settings/SettingsFragment.kt
+++ b/app/src/main/java/foundation/e/apps/settings/SettingsFragment.kt
@@ -28,12 +28,13 @@ import androidx.preference.PreferenceFragmentCompat
import foundation.e.apps.MainActivity
import foundation.e.apps.R
import foundation.e.apps.updates.UpdatesManager
+import foundation.e.apps.utils.PreferenceStorage
import java.util.concurrent.Executors
import java.util.concurrent.TimeUnit
class SettingsFragment : PreferenceFragmentCompat() {
- private var oldCheckedPreference: RadioButtonPreference? = null
+ private var oldCheckedPreference: RadioButtonPreference? = null
@SuppressLint("RestrictedApi")
@@ -41,6 +42,14 @@ class SettingsFragment : PreferenceFragmentCompat() {
// Create preferences
setPreferencesFromResource(R.xml.preferences, rootKey)
+
+ val microGInstallState = preferenceManager.findPreference(getString(R.string.prefs_microg_vrsn_installed))
+ microGInstallState?.summary = if (context?.let { PreferenceStorage(it).getBoolean(getString(R.string.prefs_microg_vrsn_installed), false) }!!) {
+ getString(R.string.microg_installed)
+ } else {
+ getString(R.string.microg_not_installed)
+ }
+
// Handle update check interval changes
val updateCheckInterval =
preferenceManager.findPreference(getString(R.string.pref_update_interval_key)) as ListPreference
@@ -100,13 +109,13 @@ class SettingsFragment : PreferenceFragmentCompat() {
private var working_dialog: ProgressDialog? = null
- fun backToMainActivity(){
+ fun backToMainActivity() {
showWorkingDialog()
val worker = Executors.newSingleThreadScheduledExecutor()
- val task = Runnable {
+ val task = Runnable {
run {
removeWorkingDialog()
- val intent= Intent(activity,MainActivity::class.java)
+ val intent = Intent(activity, MainActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK
Intent.FLAG_ACTIVITY_NEW_TASK
startActivity(intent)
diff --git a/app/src/main/java/foundation/e/apps/updates/UpdatesFragment.kt b/app/src/main/java/foundation/e/apps/updates/UpdatesFragment.kt
index 7f76f9a31048ff6592b3e1f1755f5b0fc81c589b..01152a92a9265d957c3c2d0b70111c4a3c45d693 100644
--- a/app/src/main/java/foundation/e/apps/updates/UpdatesFragment.kt
+++ b/app/src/main/java/foundation/e/apps/updates/UpdatesFragment.kt
@@ -17,9 +17,6 @@
package foundation.e.apps.updates
-import android.content.res.ColorStateList
-import android.graphics.Color
-import android.graphics.PorterDuff
import android.os.Bundle
import android.os.Handler
import android.view.LayoutInflater
@@ -40,20 +37,15 @@ import foundation.e.apps.application.model.State
import foundation.e.apps.applicationmanager.ApplicationManager
import foundation.e.apps.common.ApplicationListAdapter
import foundation.e.apps.updates.viewmodel.UpdatesViewModel
-import kotlinx.android.synthetic.main.error_layout.*
-import kotlinx.android.synthetic.main.fragment_updates.*
-
-class UpdatesFragment() : Fragment() {
+class UpdatesFragment : Fragment() {
private lateinit var updatesViewModel: UpdatesViewModel
private var applicationManager: ApplicationManager? = null
private lateinit var recyclerView: RecyclerView
private var applicationList = ArrayList()
- var accentColorOS=0;
- fun initialise(applicationManager: ApplicationManager, accentColorOS: Int) {
+ fun initialise(applicationManager: ApplicationManager) {
this.applicationManager = applicationManager
- this.accentColorOS=accentColorOS;
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
@@ -66,22 +58,12 @@ class UpdatesFragment() : Fragment() {
updatesViewModel = ViewModelProviders.of(activity!!).get(UpdatesViewModel::class.java)
recyclerView = view.findViewById(R.id.app_list)
val updateAll = view.findViewById