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