MainActivity.kt 9.63 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

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

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

52
53
class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemSelectedListener,
        ApplicationManagerServiceConnectionCallback {
Arnau Vàzquez's avatar
Arnau Vàzquez committed
54

55
    private var currentFragmentId = 0
56
    private val homeFragment = HomeFragment()
57
    private val searchFragment = SearchFragment()
58
    private val updatesFragment = UpdatesFragment()
59
60
    private val applicationManagerServiceConnection =
            ApplicationManagerServiceConnection(this)
Arnau Vàzquez's avatar
Arnau Vàzquez committed
61
62
63
64
65
66
67
68
69
70
    private val codeRequestPermissions = 9527
    var doubleBackToExitPressedOnce = false;



    companion object {
        lateinit var mActivity: MainActivity
        var sharedPreferences : SharedPreferences?=null
    }

Nihar Thakkar's avatar
Nihar Thakkar committed
71
72
73
74

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
Arnau Vàzquez's avatar
Arnau Vàzquez committed
75
76
77
78
79
80
81
82
83
84
85
86
        mActivity = this
        disableCategoryIfOpenSource()


        bottom_navigation_view.setOnNavigationItemSelectedListener{
            if (selectFragment(it.itemId,it)) {
                disableCategoryIfOpenSource()
                currentFragmentId = it.itemId
                return@setOnNavigationItemSelectedListener true
            }
            return@setOnNavigationItemSelectedListener false
        }
87

Dayona Joseph's avatar
Dayona Joseph committed
88

89
        disableShiftingOfNabBarItems()
90

Nihar Thakkar's avatar
Nihar Thakkar committed
91
92
        initialiseUpdatesWorker()

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

94
95
96
97
        // Show the home fragment by default
        currentFragmentId = if (savedInstanceState != null &&
                savedInstanceState.containsKey(CURRENTLY_SELECTED_FRAGMENT_KEY)) {
            savedInstanceState.getInt(CURRENTLY_SELECTED_FRAGMENT_KEY)
98
99
        } else if (intent.hasExtra(Constants.UPDATES_NOTIFICATION_CLICK_EXTRA)) {
            R.id.menu_updates
100
101
102
        } else {
            R.id.menu_home
        }
Dayona Joseph's avatar
Dayona Joseph committed
103
        setupLangReceiver()
104
105
        applicationManagerServiceConnection.bindService(this)
    }
106

Nihar Thakkar's avatar
Nihar Thakkar committed
107
    private fun initialiseUpdatesWorker() {
108
        UpdatesManager(applicationContext).startWorker()
Arnau Vàzquez's avatar
Arnau Vàzquez committed
109
110


Nihar Thakkar's avatar
Nihar Thakkar committed
111
112
    }

113
114
    override fun onServiceBind(applicationManager: ApplicationManager) {
        initialiseFragments(applicationManager)
Arnau Vàzquez's avatar
Arnau Vàzquez committed
115
        selectFragment(currentFragmentId, null)
Nihar Thakkar's avatar
Nihar Thakkar committed
116
    }
117

118
119
120
121
    private fun initialiseFragments(applicationManager: ApplicationManager) {
        homeFragment.initialise(applicationManager)
        searchFragment.initialise(applicationManager)
        updatesFragment.initialise(applicationManager)
122
123
    }

124
    override fun onNavigationItemSelected(item: MenuItem): Boolean {
Arnau Vàzquez's avatar
Arnau Vàzquez committed
125
        if (selectFragment(item.itemId,item)) {
126
127
128
129
130
131
            currentFragmentId = item.itemId
            return true
        }
        return false
    }

Arnau Vàzquez's avatar
Arnau Vàzquez committed
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
    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"
    }


    private fun selectFragment(fragmentId: Int, item: MenuItem?): Boolean {
149
150
        when (fragmentId) {
            R.id.menu_home -> {
Arnau Vàzquez's avatar
Arnau Vàzquez committed
151
                item?.setIcon(R.drawable.ic_menu_home)
152
153
154
                showFragment(homeFragment)
                return true
            }
155
            R.id.menu_categories -> {
Arnau Vàzquez's avatar
Arnau Vàzquez committed
156
                item?.setIcon(R.drawable.ic_menu_categories)
Nihar Thakkar's avatar
Nihar Thakkar committed
157
                showFragment(CategoriesFragment())
158
159
                return true
            }
160
            R.id.menu_search -> {
Arnau Vàzquez's avatar
Arnau Vàzquez committed
161
                item?.setIcon(R.drawable.ic_menu_search)
162
163
164
                showFragment(searchFragment)
                return true
            }
Nihar Thakkar's avatar
Nihar Thakkar committed
165
            R.id.menu_updates -> {
Arnau Vàzquez's avatar
Arnau Vàzquez committed
166
                item?.setIcon(R.drawable.ic_menu_updates)
167
168
                showFragment(updatesFragment)
                return true
Nihar Thakkar's avatar
Nihar Thakkar committed
169
            }
170
            R.id.menu_settings -> {
Arnau Vàzquez's avatar
Arnau Vàzquez committed
171
                item?.setIcon(R.drawable.ic_menu_settings)
Nihar Thakkar's avatar
Nihar Thakkar committed
172
                showFragment(SettingsFragment())
173
174
175
176
177
                return true
            }
        }
        return false
    }
Dayona Joseph's avatar
Dayona Joseph committed
178
179
180
181
182
183
184
185
186
187
188
189
190
191
    private var mLangReceiver: BroadcastReceiver? = null
    protected fun setupLangReceiver(): BroadcastReceiver? {
        if (mLangReceiver == null) {
            mLangReceiver = object : BroadcastReceiver() {
                override fun onReceive(context: Context?, intent: Intent?) {
                    finish()
//                    selectFragment(currentFragmentId,null)
                }
            }
            val filter = IntentFilter(Intent.ACTION_LOCALE_CHANGED)
            registerReceiver(mLangReceiver, filter)
        }
        return mLangReceiver
    }
192
193

    private fun showFragment(fragment: Fragment) {
194
        bottom_navigation_view.menu.findItem(currentFragmentId).isChecked = true
195
196
197
        supportFragmentManager
                .beginTransaction()
                .replace(R.id.frame_layout, fragment)
Dayona Joseph's avatar
Dayona Joseph committed
198
                .commitAllowingStateLoss();
199
200
    }

201
    @SuppressLint("RestrictedApi")
202
203
    private fun disableShiftingOfNabBarItems() {
        val menuView = bottom_navigation_view.getChildAt(0) as BottomNavigationMenuView
204
205
206
207
208
209
210
211
212
213
214
215
216
        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
217
218
219
220
221
222
223
            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)
224
225
        }
    }
226

227
228
229
230
231
232
233
234
235
    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
236
    override fun onSaveInstanceState(outState: Bundle) {
237
238
239
240
        super.onSaveInstanceState(outState)
        outState?.putInt(CURRENTLY_SELECTED_FRAGMENT_KEY, currentFragmentId)
    }

241
242
    override fun onDestroy() {
        super.onDestroy()
243
244
245
        homeFragment.decrementApplicationUses()
        searchFragment.decrementApplicationUses()
        updatesFragment.decrementApplicationUses()
246
        applicationManagerServiceConnection.unbindService(this)
247
    }
Arnau Vàzquez's avatar
Arnau Vàzquez committed
248
249
250
251
252
253
254
255

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

        this.doubleBackToExitPressedOnce = true;
Dayona Joseph's avatar
Dayona Joseph committed
256
        Toast.makeText(this, R.string.exit, Toast.LENGTH_SHORT).show();
Arnau Vàzquez's avatar
Arnau Vàzquez committed
257
258
259
260
261
262
263
264

        Handler().postDelayed(Runnable() {
            run {
                doubleBackToExitPressedOnce = false;
            }
        }, 2000)
    }
}