MainActivity.kt 11.9 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
78
        val sharedPrefFile = "kotlinsharedpreference"
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

        getAccentColor();
        bottom_navigation_view_color()
121
        openSearchFragment()
narinder Rana's avatar
narinder Rana committed
122
123
    }

124
125
126
127
128
129
130
131
132
133
    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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
    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)

151
    }
152

Nihar Thakkar's avatar
Nihar Thakkar committed
153
    private fun initialiseUpdatesWorker() {
154
        UpdatesManager(applicationContext).startWorker()
Arnau Vàzquez's avatar
Arnau Vàzquez committed
155
156


Nihar Thakkar's avatar
Nihar Thakkar committed
157
158
    }

159
160
    override fun onServiceBind(applicationManager: ApplicationManager) {
        initialiseFragments(applicationManager)
Arnau Vàzquez's avatar
Arnau Vàzquez committed
161
        selectFragment(currentFragmentId, null)
Nihar Thakkar's avatar
Nihar Thakkar committed
162
    }
163

164
    private fun initialiseFragments(applicationManager: ApplicationManager) {
narinder Rana's avatar
narinder Rana committed
165
166
167
        homeFragment.initialise(applicationManager, accentColorOS)
        searchFragment.initialise(applicationManager, accentColorOS)
        updatesFragment.initialise(applicationManager, accentColorOS)
168
169
    }

170
    override fun onNavigationItemSelected(item: MenuItem): Boolean {
Arnau Vàzquez's avatar
Arnau Vàzquez committed
171
        if (selectFragment(item.itemId,item)) {
172
173
174
175
176
177
            currentFragmentId = item.itemId
            return true
        }
        return false
    }

Arnau Vàzquez's avatar
Arnau Vàzquez committed
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
    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
193
194
195
196
197
198
199
    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
200
201

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

203
        when (fragmentId) {
narinder Rana's avatar
narinder Rana committed
204

205
            R.id.menu_home -> {
Arnau Vàzquez's avatar
Arnau Vàzquez committed
206
                item?.setIcon(R.drawable.ic_menu_home)
207
                showFragment(homeFragment)
narinder Rana's avatar
narinder Rana committed
208

209
210
                return true
            }
211
            R.id.menu_categories -> {
Arnau Vàzquez's avatar
Arnau Vàzquez committed
212
                item?.setIcon(R.drawable.ic_menu_categories)
Nihar Thakkar's avatar
Nihar Thakkar committed
213
                showFragment(CategoriesFragment())
narinder Rana's avatar
narinder Rana committed
214

215
216
                return true
            }
217
            R.id.menu_search -> {
narinder Rana's avatar
narinder Rana committed
218
                item?.setIcon(lineageos.platform.R.drawable.ic_search)
219
220
221
                showFragment(searchFragment)
                return true
            }
Nihar Thakkar's avatar
Nihar Thakkar committed
222
            R.id.menu_updates -> {
Arnau Vàzquez's avatar
Arnau Vàzquez committed
223
                item?.setIcon(R.drawable.ic_menu_updates)
224
225
                showFragment(updatesFragment)
                return true
Nihar Thakkar's avatar
Nihar Thakkar committed
226
            }
227
            R.id.menu_settings -> {
narinder Rana's avatar
narinder Rana committed
228
                item?.setIcon(lineageos.platform.R.drawable.ic_settings)
Nihar Thakkar's avatar
Nihar Thakkar committed
229
                showFragment(SettingsFragment())
230
231
232
233
234
                return true
            }
        }
        return false
    }
Dayona Joseph's avatar
Dayona Joseph committed
235
236
237
238
239
240
241
242
243
244
    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)
245
            isReceiverRegistered = true;
Dayona Joseph's avatar
Dayona Joseph committed
246
247
248
        }
        return mLangReceiver
    }
249
250

    private fun showFragment(fragment: Fragment) {
251
        bottom_navigation_view.menu.findItem(currentFragmentId).isChecked = true
252
253
254
        supportFragmentManager
                .beginTransaction()
                .replace(R.id.frame_layout, fragment)
Dayona Joseph's avatar
Dayona Joseph committed
255
                .commitAllowingStateLoss();
256
257
    }

258
    @SuppressLint("RestrictedApi")
259
260
    private fun disableShiftingOfNabBarItems() {
        val menuView = bottom_navigation_view.getChildAt(0) as BottomNavigationMenuView
261
262
263
264
265
266
267
268
269
270
271
272
273
        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
274
275
276
277
278
279
280
            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)
281
282
        }
    }
283

284
285
286
287
288
289
290
291
292
    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
293
    override fun onSaveInstanceState(outState: Bundle) {
294
295
296
297
        super.onSaveInstanceState(outState)
        outState?.putInt(CURRENTLY_SELECTED_FRAGMENT_KEY, currentFragmentId)
    }

298
299
    override fun onDestroy() {
        super.onDestroy()
300
301
302
303
        if (isReceiverRegistered) {
            unregisterReceiver(mLangReceiver)
            isReceiverRegistered = false // set it back to false.
        }
304
305
306
        homeFragment.decrementApplicationUses()
        searchFragment.decrementApplicationUses()
        updatesFragment.decrementApplicationUses()
307
        applicationManagerServiceConnection.unbindService(this)
308
    }
Arnau Vàzquez's avatar
Arnau Vàzquez committed
309
310
311
312
313
314
315
316

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

        this.doubleBackToExitPressedOnce = true;
Dayona Joseph's avatar
Dayona Joseph committed
317
        Toast.makeText(this, R.string.exit, Toast.LENGTH_SHORT).show();
Arnau Vàzquez's avatar
Arnau Vàzquez committed
318
319
320
321
322
323
324

        Handler().postDelayed(Runnable() {
            run {
                doubleBackToExitPressedOnce = false;
            }
        }, 2000)
    }
narinder Rana's avatar
narinder Rana committed
325
326
327
328
329
330
331

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

narinder Rana's avatar
narinder Rana committed
332
333
334
335
        accentColorOS=this.resources.getColor(R.color.colorAccent);



narinder Rana's avatar
narinder Rana committed
336
337
    }

338
}