/*
* Copyright (C) 2019-2021 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
//import androidx.fragment.app.ListFragment
import android.annotation.SuppressLint
import android.content.*
import android.content.pm.PackageManager
import android.content.res.ColorStateList
import android.database.Cursor
import android.graphics.Color
import android.os.Bundle
import android.os.Handler
import android.preference.PreferenceManager
import android.view.MenuItem
import android.widget.Toast
import androidx.annotation.ColorRes
import androidx.appcompat.app.AppCompatActivity
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
import com.google.android.material.bottomnavigation.BottomNavigationView
import com.google.android.material.bottomnavigation.LabelVisibilityMode
import com.google.android.material.snackbar.Snackbar
import foundation.e.apps.applicationmanager.ApplicationManager
import foundation.e.apps.applicationmanager.ApplicationManagerServiceConnection
import foundation.e.apps.applicationmanager.ApplicationManagerServiceConnectionCallback
import foundation.e.apps.categories.CategoriesFragment
import foundation.e.apps.home.HomeFragment
import foundation.e.apps.search.SearchFragment
import foundation.e.apps.settings.SettingsFragment
import foundation.e.apps.updates.UpdatesFragment
import foundation.e.apps.updates.UpdatesManager
import foundation.e.apps.utils.Constants
import foundation.e.apps.utils.Constants.CURRENTLY_SELECTED_FRAGMENT_KEY
import foundation.e.apps.utils.PreferenceStorage
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemSelectedListener,
ApplicationManagerServiceConnectionCallback {
private var currentFragmentId = 0
private val homeFragment = HomeFragment()
private val searchFragment = SearchFragment()
private val updatesFragment = UpdatesFragment()
private val applicationManagerServiceConnection =
ApplicationManagerServiceConnection(this)
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()
currentFragmentId = it.itemId
return@setOnNavigationItemSelectedListener true
}
return@setOnNavigationItemSelectedListener false
}
disableShiftingOfNabBarItems()
initialiseUpdatesWorker()
// Show the home fragment by default
currentFragmentId = if (savedInstanceState != null &&
savedInstanceState.containsKey(CURRENTLY_SELECTED_FRAGMENT_KEY)) {
savedInstanceState.getInt(CURRENTLY_SELECTED_FRAGMENT_KEY)
} else if (intent.hasExtra(Constants.UPDATES_NOTIFICATION_CLICK_EXTRA)) {
R.id.menu_updates
} else {
R.id.menu_home
}
setupLangReceiver()
applicationManagerServiceConnection.bindService(this)
getAccentColor();
bottom_navigation_view_color()
openSearchFragment()
}
override fun onResume() {
super.onResume()
if (retrieveStatus() != null) {
if (retrieveStatus().equals("true")) {
PreferenceStorage(this).save(getString(R.string.prefs_microg_vrsn_installed), true)
} else {
PreferenceStorage(this).save(getString(R.string.prefs_microg_vrsn_installed), false)
}
} else {
PreferenceStorage(this).save(getString(R.string.prefs_microg_vrsn_installed), false)
}
}
private fun openSearchFragment() {
if (intent.getBooleanExtra(Constants.OPEN_SEARCH,false)) {
currentFragmentId = R.id.menu_search
val bundle = Bundle()
bundle.putString(Constants.MICROG_QUERY,"microg")
searchFragment.arguments= bundle
}
}
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 retrieveStatus(): String? {
var status: String? = null
val c: Cursor? = contentResolver.query(MicroGProvider.CONTENT_URI, null, "id=?", arrayOf("1"), "installStatus")
if (c!!.moveToFirst()) {
do {
status = c.getString(c.getColumnIndex("installStatus"))
} while (c.moveToNext())
}
c.close()
return status
}
private fun initialiseUpdatesWorker() {
UpdatesManager(applicationContext).startWorker()
}
override fun onServiceBind(applicationManager: ApplicationManager) {
initialiseFragments(applicationManager)
selectFragment(currentFragmentId, null)
}
private fun initialiseFragments(applicationManager: ApplicationManager) {
homeFragment.initialise(applicationManager, accentColorOS)
searchFragment.initialise(applicationManager, accentColorOS)
updatesFragment.initialise(applicationManager, accentColorOS)
}
override fun onNavigationItemSelected(item: MenuItem): Boolean {
if (selectFragment(item.itemId,item)) {
currentFragmentId = item.itemId
return true
}
return false
}
fun showApplicationTypePreference(): String {
val preferences = PreferenceManager.getDefaultSharedPreferences(mActivity)
var showAllApps = preferences.getBoolean(mActivity.getString(R.string.Show_all_apps), true)
var showAllOpenSourceApps = preferences.getBoolean(mActivity.getString(R.string.show_only_open_source_apps_key), false)
var showAllPwaApps = preferences.getBoolean(mActivity.getString(R.string.show_only_pwa_apps_key), false)
if (showAllOpenSourceApps) {
return "open"
} else if (showAllApps) {
return "any"
} else if (showAllPwaApps) {
return "pwa"
}
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 -> {
item?.setIcon(lineageos.platform.R.drawable.ic_search)
showFragment(searchFragment)
return true
}
R.id.menu_updates -> {
item?.setIcon(R.drawable.ic_menu_updates)
showFragment(updatesFragment)
return true
}
R.id.menu_settings -> {
item?.setIcon(lineageos.platform.R.drawable.ic_settings)
showFragment(SettingsFragment())
return true
}
}
return false
}
private var mLangReceiver: BroadcastReceiver? = null
protected fun setupLangReceiver(): BroadcastReceiver? {
if (mLangReceiver == null) {
mLangReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
finish()
}
}
val filter = IntentFilter(Intent.ACTION_LOCALE_CHANGED)
registerReceiver(mLangReceiver, filter)
isReceiverRegistered = true;
}
return mLangReceiver
}
private fun showFragment(fragment: Fragment) {
bottom_navigation_view.menu.findItem(currentFragmentId).isChecked = true
supportFragmentManager
.beginTransaction()
.replace(R.id.frame_layout, fragment)
.commitAllowingStateLoss();
}
@SuppressLint("RestrictedApi")
private fun disableShiftingOfNabBarItems() {
val menuView = bottom_navigation_view.getChildAt(0) as BottomNavigationMenuView
try {
val mShiftingMode = menuView.javaClass.getDeclaredField("mShiftingMode")
mShiftingMode.isAccessible = true
mShiftingMode.setBoolean(menuView, false)
mShiftingMode.isAccessible = false
} catch (e: NoSuchFieldException) {
e.printStackTrace()
} catch (e: IllegalAccessException) {
e.printStackTrace()
}
for (i in 0 until menuView.childCount) {
val itemView = menuView.getChildAt(i) as BottomNavigationItemView
itemView.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED); itemView.setChecked(itemView.itemData.isChecked)
}
}
private fun disableCategoryIfOpenSource(){
if(showApplicationTypePreference()=="open") {
bottom_navigation_view.menu.removeItem(R.id.menu_categories)
}
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array,
grantResults: IntArray) {
if (requestCode == Constants.STORAGE_PERMISSION_REQUEST_CODE &&
grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_DENIED) {
Snackbar.make(container, R.string.error_storage_permission_denied,
Snackbar.LENGTH_LONG).show()
}
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putInt(CURRENTLY_SELECTED_FRAGMENT_KEY, currentFragmentId)
}
override fun onDestroy() {
super.onDestroy()
if (isReceiverRegistered) {
unregisterReceiver(mLangReceiver)
isReceiverRegistered = false // set it back to false.
}
homeFragment.decrementApplicationUses()
searchFragment.decrementApplicationUses()
updatesFragment.decrementApplicationUses()
applicationManagerServiceConnection.unbindService(this)
}
override fun onBackPressed() {
if (doubleBackToExitPressedOnce) {
super.onBackPressed()
return
}
this.doubleBackToExitPressedOnce = true;
Toast.makeText(this, R.string.exit, Toast.LENGTH_SHORT).show();
Handler().postDelayed(Runnable() {
run {
doubleBackToExitPressedOnce = false;
}
}, 2000)
}
/*
* get Accent color from OS
*
* */
private fun getAccentColor() {
accentColorOS=this.resources.getColor(R.color.colorAccent);
}
}