MainActivity.kt 11.5 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
27
import android.content.res.ColorStateList
import android.graphics.Color
Nihar Thakkar's avatar
Nihar Thakkar committed
28
import android.os.Bundle
Arnau Vàzquez's avatar
Arnau Vàzquez committed
29
30
import android.os.Handler
import android.preference.PreferenceManager
narinder Rana's avatar
narinder Rana committed
31
import android.util.TypedValue
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
35
import androidx.annotation.ColorInt
import androidx.annotation.ColorRes
Arnau Vàzquez's avatar
Arnau Vàzquez committed
36
import androidx.appcompat.app.AppCompatActivity
narinder Rana's avatar
narinder Rana committed
37
38
39
import androidx.appcompat.view.ContextThemeWrapper
import androidx.core.content.ContextCompat
import androidx.core.graphics.drawable.DrawableCompat
Arnau Vàzquez's avatar
Arnau Vàzquez committed
40
41
42
43
44
45
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
46
47
48
49
50
51
52
53
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
54
import foundation.e.apps.updates.UpdatesManager
55
56
import foundation.e.apps.utils.Constants
import foundation.e.apps.utils.Constants.CURRENTLY_SELECTED_FRAGMENT_KEY
57
import kotlinx.android.synthetic.main.activity_main.*
Nihar Thakkar's avatar
Nihar Thakkar committed
58

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

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

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


    companion object {
        lateinit var mActivity: MainActivity
        var sharedPreferences : SharedPreferences?=null
narinder Rana's avatar
narinder Rana committed
78

Arnau Vàzquez's avatar
Arnau Vàzquez committed
79
80
    }

Nihar Thakkar's avatar
Nihar Thakkar committed
81

narinder Rana's avatar
narinder Rana committed
82

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

narinder Rana's avatar
narinder Rana committed
90
91


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

Dayona Joseph's avatar
Dayona Joseph committed
101

102
        disableShiftingOfNabBarItems()
103

Nihar Thakkar's avatar
Nihar Thakkar committed
104
105
        initialiseUpdatesWorker()

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

107
108
109
110
        // Show the home fragment by default
        currentFragmentId = if (savedInstanceState != null &&
                savedInstanceState.containsKey(CURRENTLY_SELECTED_FRAGMENT_KEY)) {
            savedInstanceState.getInt(CURRENTLY_SELECTED_FRAGMENT_KEY)
111
112
        } else if (intent.hasExtra(Constants.UPDATES_NOTIFICATION_CLICK_EXTRA)) {
            R.id.menu_updates
113
114
115
        } else {
            R.id.menu_home
        }
Dayona Joseph's avatar
Dayona Joseph committed
116
        setupLangReceiver()
117
        applicationManagerServiceConnection.bindService(this)
narinder Rana's avatar
narinder Rana committed
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139

        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)

140
    }
141

Nihar Thakkar's avatar
Nihar Thakkar committed
142
    private fun initialiseUpdatesWorker() {
143
        UpdatesManager(applicationContext).startWorker()
Arnau Vàzquez's avatar
Arnau Vàzquez committed
144
145


Nihar Thakkar's avatar
Nihar Thakkar committed
146
147
    }

148
149
    override fun onServiceBind(applicationManager: ApplicationManager) {
        initialiseFragments(applicationManager)
Arnau Vàzquez's avatar
Arnau Vàzquez committed
150
        selectFragment(currentFragmentId, null)
Nihar Thakkar's avatar
Nihar Thakkar committed
151
    }
152

153
    private fun initialiseFragments(applicationManager: ApplicationManager) {
narinder Rana's avatar
narinder Rana committed
154
155
156
        homeFragment.initialise(applicationManager, accentColorOS)
        searchFragment.initialise(applicationManager, accentColorOS)
        updatesFragment.initialise(applicationManager, accentColorOS)
157
158
    }

159
    override fun onNavigationItemSelected(item: MenuItem): Boolean {
Arnau Vàzquez's avatar
Arnau Vàzquez committed
160
        if (selectFragment(item.itemId,item)) {
161
162
163
164
165
166
            currentFragmentId = item.itemId
            return true
        }
        return false
    }

Arnau Vàzquez's avatar
Arnau Vàzquez committed
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
    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
182
183
184
185
186
187
188
    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
189
190

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

192
        when (fragmentId) {
narinder Rana's avatar
narinder Rana committed
193

194
            R.id.menu_home -> {
Arnau Vàzquez's avatar
Arnau Vàzquez committed
195
                item?.setIcon(R.drawable.ic_menu_home)
196
                showFragment(homeFragment)
narinder Rana's avatar
narinder Rana committed
197

198
199
                return true
            }
200
            R.id.menu_categories -> {
Arnau Vàzquez's avatar
Arnau Vàzquez committed
201
                item?.setIcon(R.drawable.ic_menu_categories)
Nihar Thakkar's avatar
Nihar Thakkar committed
202
                showFragment(CategoriesFragment())
narinder Rana's avatar
narinder Rana committed
203

204
205
                return true
            }
206
            R.id.menu_search -> {
Arnau Vàzquez's avatar
Arnau Vàzquez committed
207
                item?.setIcon(R.drawable.ic_menu_search)
208
209
210
                showFragment(searchFragment)
                return true
            }
Nihar Thakkar's avatar
Nihar Thakkar committed
211
            R.id.menu_updates -> {
Arnau Vàzquez's avatar
Arnau Vàzquez committed
212
                item?.setIcon(R.drawable.ic_menu_updates)
213
214
                showFragment(updatesFragment)
                return true
Nihar Thakkar's avatar
Nihar Thakkar committed
215
            }
216
            R.id.menu_settings -> {
Arnau Vàzquez's avatar
Arnau Vàzquez committed
217
                item?.setIcon(R.drawable.ic_menu_settings)
Nihar Thakkar's avatar
Nihar Thakkar committed
218
                showFragment(SettingsFragment())
219
220
221
222
223
                return true
            }
        }
        return false
    }
Dayona Joseph's avatar
Dayona Joseph committed
224
225
226
227
228
229
230
231
232
233
    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)
234
            isReceiverRegistered = true;
Dayona Joseph's avatar
Dayona Joseph committed
235
236
237
        }
        return mLangReceiver
    }
238
239

    private fun showFragment(fragment: Fragment) {
240
        bottom_navigation_view.menu.findItem(currentFragmentId).isChecked = true
241
242
243
        supportFragmentManager
                .beginTransaction()
                .replace(R.id.frame_layout, fragment)
Dayona Joseph's avatar
Dayona Joseph committed
244
                .commitAllowingStateLoss();
245
246
    }

247
    @SuppressLint("RestrictedApi")
248
249
    private fun disableShiftingOfNabBarItems() {
        val menuView = bottom_navigation_view.getChildAt(0) as BottomNavigationMenuView
250
251
252
253
254
255
256
257
258
259
260
261
262
        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
263
264
265
266
267
268
269
            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)
270
271
        }
    }
272

273
274
275
276
277
278
279
280
281
    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
282
    override fun onSaveInstanceState(outState: Bundle) {
283
284
285
286
        super.onSaveInstanceState(outState)
        outState?.putInt(CURRENTLY_SELECTED_FRAGMENT_KEY, currentFragmentId)
    }

287
288
    override fun onDestroy() {
        super.onDestroy()
289
290
291
292
        if (isReceiverRegistered) {
            unregisterReceiver(mLangReceiver)
            isReceiverRegistered = false // set it back to false.
        }
293
294
295
        homeFragment.decrementApplicationUses()
        searchFragment.decrementApplicationUses()
        updatesFragment.decrementApplicationUses()
296
        applicationManagerServiceConnection.unbindService(this)
297
    }
Arnau Vàzquez's avatar
Arnau Vàzquez committed
298
299
300
301
302
303
304
305

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

        this.doubleBackToExitPressedOnce = true;
Dayona Joseph's avatar
Dayona Joseph committed
306
        Toast.makeText(this, R.string.exit, Toast.LENGTH_SHORT).show();
Arnau Vàzquez's avatar
Arnau Vàzquez committed
307
308
309
310
311
312
313

        Handler().postDelayed(Runnable() {
            run {
                doubleBackToExitPressedOnce = false;
            }
        }, 2000)
    }
narinder Rana's avatar
narinder Rana committed
314
315
316
317
318
319
320

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

narinder Rana's avatar
narinder Rana committed
321
322
323
324
        accentColorOS=this.resources.getColor(R.color.colorAccent);



narinder Rana's avatar
narinder Rana committed
325
326
    }

Arnau Vàzquez's avatar
Arnau Vàzquez committed
327
}