MainActivity.kt 12.7 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*
    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 <https://www.gnu.org/licenses/>.
 */

18
package foundation.e.apps
Nihar Thakkar's avatar
Nihar Thakkar committed
19

Arnau Vàzquez's avatar
Arnau Vàzquez committed
20
//import androidx.fragment.app.ListFragment
Dayona Joseph's avatar
Dayona Joseph committed
21

narinder Rana's avatar
narinder Rana committed
22

23
import android.annotation.SuppressLint
Dayona Joseph's avatar
Dayona Joseph committed
24
import android.content.*
25
import android.content.pm.PackageManager
narinder Rana's avatar
narinder Rana committed
26
import android.content.res.ColorStateList
27
import android.database.Cursor
narinder Rana's avatar
narinder Rana committed
28
import android.graphics.Color
Nihar Thakkar's avatar
Nihar Thakkar committed
29
import android.os.Bundle
Arnau Vàzquez's avatar
Arnau Vàzquez committed
30
31
import android.os.Handler
import android.preference.PreferenceManager
32
import android.view.MenuItem
Arnau Vàzquez's avatar
Arnau Vàzquez committed
33
import android.widget.Toast
narinder Rana's avatar
narinder Rana committed
34
import androidx.annotation.ColorRes
Arnau Vàzquez's avatar
Arnau Vàzquez committed
35
import androidx.appcompat.app.AppCompatActivity
narinder Rana's avatar
narinder Rana committed
36
37
import androidx.core.content.ContextCompat
import androidx.core.graphics.drawable.DrawableCompat
Arnau Vàzquez's avatar
Arnau Vàzquez committed
38
39
40
41
42
43
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
44
45
46
47
48
49
50
51
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
52
import foundation.e.apps.updates.UpdatesManager
53
54
import foundation.e.apps.utils.Constants
import foundation.e.apps.utils.Constants.CURRENTLY_SELECTED_FRAGMENT_KEY
55
import foundation.e.apps.utils.PreferenceStorage
56
import kotlinx.android.synthetic.main.activity_main.*
Nihar Thakkar's avatar
Nihar Thakkar committed
57

Arnau Vàzquez's avatar
Arnau Vàzquez committed
58

59
60
class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemSelectedListener,
        ApplicationManagerServiceConnectionCallback {
Arnau Vàzquez's avatar
Arnau Vàzquez committed
61

62
    private var currentFragmentId = 0
63
    private val homeFragment = HomeFragment()
64
    private val searchFragment = SearchFragment()
65
    private val updatesFragment = UpdatesFragment()
66
67
    private val applicationManagerServiceConnection =
            ApplicationManagerServiceConnection(this)
Arnau Vàzquez's avatar
Arnau Vàzquez committed
68
69
    private val codeRequestPermissions = 9527
    var doubleBackToExitPressedOnce = false;
70
    private var isReceiverRegistered = false
narinder Rana's avatar
narinder Rana committed
71
    var accentColorOS = 0
Arnau Vàzquez's avatar
Arnau Vàzquez committed
72
73
74
75
76


    companion object {
        lateinit var mActivity: MainActivity
        var sharedPreferences : SharedPreferences?=null
77
        val sharedPrefFile = "kotlinsharedpreference"
Arnau Vàzquez's avatar
Arnau Vàzquez committed
78
79
    }

Nihar Thakkar's avatar
Nihar Thakkar committed
80

narinder Rana's avatar
narinder Rana committed
81

Nihar Thakkar's avatar
Nihar Thakkar committed
82
83
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
narinder Rana's avatar
narinder Rana committed
84
        //ThemeColors(this);
Nihar Thakkar's avatar
Nihar Thakkar committed
85
        setContentView(R.layout.activity_main)
Arnau Vàzquez's avatar
Arnau Vàzquez committed
86
87
88
        mActivity = this
        disableCategoryIfOpenSource()

narinder Rana's avatar
narinder Rana committed
89

Arnau Vàzquez's avatar
Arnau Vàzquez committed
90
91
92
93
94
95
96
97
        bottom_navigation_view.setOnNavigationItemSelectedListener{
            if (selectFragment(it.itemId,it)) {
                disableCategoryIfOpenSource()
                currentFragmentId = it.itemId
                return@setOnNavigationItemSelectedListener true
            }
            return@setOnNavigationItemSelectedListener false
        }
98

Dayona Joseph's avatar
Dayona Joseph committed
99

100
        disableShiftingOfNabBarItems()
101

Nihar Thakkar's avatar
Nihar Thakkar committed
102
103
        initialiseUpdatesWorker()

Arnau Vàzquez's avatar
Arnau Vàzquez committed
104

105
106
107
108
        // Show the home fragment by default
        currentFragmentId = if (savedInstanceState != null &&
                savedInstanceState.containsKey(CURRENTLY_SELECTED_FRAGMENT_KEY)) {
            savedInstanceState.getInt(CURRENTLY_SELECTED_FRAGMENT_KEY)
109
110
        } else if (intent.hasExtra(Constants.UPDATES_NOTIFICATION_CLICK_EXTRA)) {
            R.id.menu_updates
111
112
113
        } else {
            R.id.menu_home
        }
Dayona Joseph's avatar
Dayona Joseph committed
114
        setupLangReceiver()
115
        applicationManagerServiceConnection.bindService(this)
narinder Rana's avatar
narinder Rana committed
116
117
118

        getAccentColor();
        bottom_navigation_view_color()
119
        openSearchFragment()
narinder Rana's avatar
narinder Rana committed
120
121
    }

122
123
124
125
126
127
128
129
130
131
132
133
134
    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)
        }
    }

135
136
137
138
139
140
141
142
143
144
    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
        }
    }


narinder Rana's avatar
narinder Rana committed
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
    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)

162
    }
163

164
165
166
167
168
169
170
171
172
173
174
175
176
    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
    }


Nihar Thakkar's avatar
Nihar Thakkar committed
177
    private fun initialiseUpdatesWorker() {
178
        UpdatesManager(applicationContext).startWorker()
Arnau Vàzquez's avatar
Arnau Vàzquez committed
179
180


Nihar Thakkar's avatar
Nihar Thakkar committed
181
182
    }

183
184
    override fun onServiceBind(applicationManager: ApplicationManager) {
        initialiseFragments(applicationManager)
Arnau Vàzquez's avatar
Arnau Vàzquez committed
185
        selectFragment(currentFragmentId, null)
Nihar Thakkar's avatar
Nihar Thakkar committed
186
    }
187

188
    private fun initialiseFragments(applicationManager: ApplicationManager) {
narinder Rana's avatar
narinder Rana committed
189
190
191
        homeFragment.initialise(applicationManager, accentColorOS)
        searchFragment.initialise(applicationManager, accentColorOS)
        updatesFragment.initialise(applicationManager, accentColorOS)
192
193
    }

194
    override fun onNavigationItemSelected(item: MenuItem): Boolean {
Arnau Vàzquez's avatar
Arnau Vàzquez committed
195
        if (selectFragment(item.itemId,item)) {
196
197
198
199
200
201
            currentFragmentId = item.itemId
            return true
        }
        return false
    }

Arnau Vàzquez's avatar
Arnau Vàzquez committed
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
    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"
    }

narinder Rana's avatar
narinder Rana committed
217
218
219
220
221
222
223
    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
    }
Arnau Vàzquez's avatar
Arnau Vàzquez committed
224
225

    private fun selectFragment(fragmentId: Int, item: MenuItem?): Boolean {
narinder Rana's avatar
narinder Rana committed
226

227
        when (fragmentId) {
narinder Rana's avatar
narinder Rana committed
228

229
            R.id.menu_home -> {
Arnau Vàzquez's avatar
Arnau Vàzquez committed
230
                item?.setIcon(R.drawable.ic_menu_home)
231
                showFragment(homeFragment)
narinder Rana's avatar
narinder Rana committed
232

233
234
                return true
            }
235
            R.id.menu_categories -> {
Arnau Vàzquez's avatar
Arnau Vàzquez committed
236
                item?.setIcon(R.drawable.ic_menu_categories)
Nihar Thakkar's avatar
Nihar Thakkar committed
237
                showFragment(CategoriesFragment())
narinder Rana's avatar
narinder Rana committed
238

239
240
                return true
            }
241
            R.id.menu_search -> {
narinder Rana's avatar
narinder Rana committed
242
                item?.setIcon(lineageos.platform.R.drawable.ic_search)
243
244
245
                showFragment(searchFragment)
                return true
            }
Nihar Thakkar's avatar
Nihar Thakkar committed
246
            R.id.menu_updates -> {
Arnau Vàzquez's avatar
Arnau Vàzquez committed
247
                item?.setIcon(R.drawable.ic_menu_updates)
248
249
                showFragment(updatesFragment)
                return true
Nihar Thakkar's avatar
Nihar Thakkar committed
250
            }
251
            R.id.menu_settings -> {
narinder Rana's avatar
narinder Rana committed
252
                item?.setIcon(lineageos.platform.R.drawable.ic_settings)
Nihar Thakkar's avatar
Nihar Thakkar committed
253
                showFragment(SettingsFragment())
254
255
256
257
258
                return true
            }
        }
        return false
    }
Dayona Joseph's avatar
Dayona Joseph committed
259
260
261
262
263
264
265
266
267
268
    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)
269
            isReceiverRegistered = true;
Dayona Joseph's avatar
Dayona Joseph committed
270
271
272
        }
        return mLangReceiver
    }
273
274

    private fun showFragment(fragment: Fragment) {
275
        bottom_navigation_view.menu.findItem(currentFragmentId).isChecked = true
276
277
278
        supportFragmentManager
                .beginTransaction()
                .replace(R.id.frame_layout, fragment)
Dayona Joseph's avatar
Dayona Joseph committed
279
                .commitAllowingStateLoss();
280
281
    }

282
    @SuppressLint("RestrictedApi")
283
284
    private fun disableShiftingOfNabBarItems() {
        val menuView = bottom_navigation_view.getChildAt(0) as BottomNavigationMenuView
285
286
287
288
289
290
291
292
293
294
295
296
297
        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
Arnau Vàzquez's avatar
Arnau Vàzquez committed
298
299
300
301
302
303
304
            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)
305
306
        }
    }
307

308
309
310
311
312
313
314
315
316
    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>,
                                            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()
        }
    }

Arnau Vàzquez's avatar
Arnau Vàzquez committed
317
    override fun onSaveInstanceState(outState: Bundle) {
318
        super.onSaveInstanceState(outState)
319
        outState.putInt(CURRENTLY_SELECTED_FRAGMENT_KEY, currentFragmentId)
320
321
    }

322
323
    override fun onDestroy() {
        super.onDestroy()
324
325
326
327
        if (isReceiverRegistered) {
            unregisterReceiver(mLangReceiver)
            isReceiverRegistered = false // set it back to false.
        }
328
329
330
        homeFragment.decrementApplicationUses()
        searchFragment.decrementApplicationUses()
        updatesFragment.decrementApplicationUses()
331
        applicationManagerServiceConnection.unbindService(this)
332
    }
Arnau Vàzquez's avatar
Arnau Vàzquez committed
333
334
335
336
337
338
339
340

    override fun onBackPressed() {
        if (doubleBackToExitPressedOnce) {
            super.onBackPressed()
            return
        }

        this.doubleBackToExitPressedOnce = true;
Dayona Joseph's avatar
Dayona Joseph committed
341
        Toast.makeText(this, R.string.exit, Toast.LENGTH_SHORT).show();
Arnau Vàzquez's avatar
Arnau Vàzquez committed
342
343
344
345
346
347
348

        Handler().postDelayed(Runnable() {
            run {
                doubleBackToExitPressedOnce = false;
            }
        }, 2000)
    }
narinder Rana's avatar
narinder Rana committed
349
350
351
352
353
354
355

    /*
    * get Accent color from OS
    *
    *  */
    private fun getAccentColor() {

narinder Rana's avatar
narinder Rana committed
356
357
358
359
        accentColorOS=this.resources.getColor(R.color.colorAccent);



narinder Rana's avatar
narinder Rana committed
360
361
    }

362
}