package com.denizd.substitutionplan import android.app.ActivityManager import android.app.job.JobInfo import android.app.job.JobScheduler import android.content.ComponentName import android.content.Context import android.content.Intent import android.content.SharedPreferences import android.graphics.BitmapFactory import android.net.ConnectivityManager import android.net.NetworkInfo import android.os.Build import android.os.Bundle import android.os.Handler import android.preference.PreferenceManager import android.util.AttributeSet import android.view.* import android.view.animation.Animation import android.view.animation.AnimationUtils import android.widget.ImageView import android.widget.LinearLayout import android.widget.TextView import androidx.appcompat.app.AlertDialog import androidx.appcompat.widget.Toolbar import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.content.ContextCompat import androidx.core.widget.NestedScrollView import androidx.fragment.app.Fragment import androidx.recyclerview.widget.RecyclerView import com.google.android.material.appbar.AppBarLayout import com.google.android.material.bottomnavigation.BottomNavigationView import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.chip.Chip import com.google.android.material.snackbar.Snackbar import com.jaredrummler.android.device.DeviceName import java.lang.IllegalArgumentException import java.text.SimpleDateFormat import java.util.* class Main : AppCompatActivity(R.layout.activity_main) { var bottomSheetExpanded = false lateinit var bottomSheetBehaviour: BottomSheetBehavior<*> override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val context = this as Context val prefs = PreferenceManager.getDefaultSharedPreferences(context) as SharedPreferences val edit = prefs.edit() val firstTime = Intent(context, FirstTime::class.java) if (prefs.getBoolean("firstTime", true)) { startActivity(firstTime) finish() } else { edit.putInt("launchDev", prefs.getInt("launchDev", 0) + 1) edit.apply() notificationJob() val handler = Handler() val appbarlayout = findViewById(R.id.appbarlayout) val toolbarTxt = findViewById(R.id.toolbarTxt) val bottomSheetRoot = findViewById(R.id.bottom_sheet) bottomSheetBehaviour = BottomSheetBehavior.from(bottomSheetRoot) val bottomNav = findViewById(R.id.bottom_nav) val fragmentContainer = findViewById(R.id.fragment_container) val bottomSheetCloser = findViewById(R.id.bottom_sheet_closer) val chip = findViewById(R.id.chip) val contextView = findViewById(R.id.coordination) val window = this.window as Window bottomSheetExpanded = bottomSheetBehaviour.state == BottomSheetBehavior.STATE_EXPANDED setTheme(R.style.AppTheme0) when (prefs.getInt("themeInt", 0)) { 0 -> { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR window.navigationBarColor = ContextCompat.getColor(this, R.color.background) } } else -> { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) window.navigationBarColor = ContextCompat.getColor(this, R.color.background) } } val bm = BitmapFactory.decodeResource(resources, R.mipmap.ic_launcher) val taskDesc = ActivityManager.TaskDescription(getString(R.string.app_name), bm, ContextCompat.getColor(this, R.color.background)) setTaskDescription(taskDesc) if (!prefs.getBoolean("showinfotab", true)) { bottomNav.menu.removeItem(R.id.openinfopanel) } fragmentContainer.setOnClickListener { bottomSheetBehaviour.setState(BottomSheetBehavior.STATE_COLLAPSED) } bottomSheetBehaviour.setBottomSheetCallback(object: BottomSheetBehavior.BottomSheetCallback() { override fun onStateChanged(bottomSheet: View, newState: Int) { if (bottomSheetBehaviour.state == BottomSheetBehavior.STATE_EXPANDED) { bottomSheetCloser.visibility = View.VISIBLE } else if (bottomSheetBehaviour.state == BottomSheetBehavior.STATE_COLLAPSED) { bottomSheetCloser.visibility = View.GONE } } override fun onSlide(bottomSheet: View, slideOffset: Float) { } }) bottomSheetCloser.setOnClickListener { bottomSheetCloser.visibility = View.GONE bottomSheetBehaviour.state = BottomSheetBehavior.STATE_COLLAPSED } if (!prefs.getBoolean("autoRefresh", false) && prefs.getInt("firstTimeOpening", 0) != 0) { try { val oldFormat = "EEE, dd MMM yyyy HH:mm:ss zzz" val newFormat = "yyyy-MM-dd, HH:mm:ss" val d = Date(prefs.getString("time", "")) val sdf = SimpleDateFormat(oldFormat) sdf.applyPattern(newFormat) val newDate = sdf.format(d) val sb = StringBuilder() val updated = sb.append(getText(R.string.lastupdatedK)).append(newDate).toString() Snackbar.make(contextView, updated, Snackbar.LENGTH_LONG).show() } catch (e: IllegalArgumentException) {} } if (prefs.getBoolean("huaweiDeviceDialog", true)) { DeviceName.with(context).request { info, _ -> if (info.manufacturer.contains("Huawei") || info.manufacturer.contains("Honor") || info.manufacturer.contains("Xiaomi")) { val alertDialog: AlertDialog.Builder = if (prefs.getInt("themeInt", 0) == 1) { AlertDialog.Builder(context, R.style.AlertDialogCustomDark) } else { AlertDialog.Builder(context, R.style.AlertDialogCustomLight) } // TODO dialogue theming val dialogView = LayoutInflater.from(context).inflate(R.layout.secret_dialog, null) val title = dialogView.findViewById(R.id.textviewtitle) title.text = getString(R.string.chinaTitle) val dialogText = dialogView.findViewById(R.id.dialogtext) dialogText.text = getString(R.string.chinaDialog) alertDialog.setView(dialogView).show() edit.putBoolean("huaweiDeviceDialog", false).apply() } } } val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val statusMobile = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).state val statusWifi = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).state if (statusMobile != NetworkInfo.State.CONNECTED && statusWifi != NetworkInfo.State.CONNECTED) { Snackbar.make(contextView, getText(R.string.nointernet), Snackbar.LENGTH_LONG).show() } if (prefs.getBoolean("greeting", false)) { if (prefs.getString("username", "").isNotEmpty()) { val animationIn = AnimationUtils.loadAnimation(context, R.anim.chip_slide_in) val animationOut = AnimationUtils.loadAnimation(context, R.anim.chip_slide_out) val generator = Random() val greetings = resources.getStringArray(R.array.greeting8_array) val rightNow = Calendar.getInstance() val currentHour = rightNow.get(Calendar.HOUR_OF_DAY) chip.text = when (generator.nextInt(9)) { 0 -> getString(R.string.greeting0, prefs.getString("username", "")) 1 -> getString(R.string.greeting1, prefs.getString("username", "")) 2 -> getString(R.string.greeting2, prefs.getString("username", "")) 3 -> getString(R.string.greeting3, prefs.getString("username", "")) 4 -> getString(R.string.greeting4, prefs.getString("username", "")) 5 -> getString(R.string.greeting5, prefs.getString("username", "")) 6 -> getString(R.string.greeting6, prefs.getString("username", "")) 7 -> getString(R.string.greeting7, prefs.getString("username", "")) 8 -> { when { currentHour < 11 -> greetings[0] + prefs.getString("username", "") + "." currentHour in 11..17 -> greetings[1] + prefs.getString("username", "") + "." else -> greetings[1] + prefs.getString("username", "") + "." } } else -> getString(R.string.error) } handler.postDelayed({ chip.visibility = View.VISIBLE chip.startAnimation(animationIn) }, 500) handler.postDelayed({ chip.startAnimation(animationOut) }, 3000) animationOut.setAnimationListener(object: Animation.AnimationListener { override fun onAnimationStart(animation: Animation?) {} override fun onAnimationRepeat(animation: Animation?) {} override fun onAnimationEnd(animation: Animation?) { chip.visibility = View.GONE } }) } } if (prefs.getInt("firstTimeOpening", 0) == 0) { handler.postDelayed({ bottomSheetBehaviour.state = BottomSheetBehavior.STATE_EXPANDED }, 600) handler.postDelayed({ bottomSheetBehaviour.state = BottomSheetBehavior.STATE_COLLAPSED }, 2000) edit.putInt("firstTimeOpening", prefs.getInt("firstTimeOpening", 0) + 1).apply() } if (prefs.getBoolean("openInfo", false)) { handler.postDelayed({ bottomSheetBehaviour.state = BottomSheetBehavior.STATE_EXPANDED }, 600) } val userPlan: String = if (prefs.getString("username", "").toString().isNotEmpty()) { when (prefs.getString("username", "")[prefs.getString("username", "").length - 1].toString().toLowerCase()) { "s", "x", "z" -> prefs.getString("username", "") + getString(R.string.nosplan) else -> prefs.getString("username", "") + getString(R.string.splan) } } else { getString(R.string.personalplan) } if (prefs.getBoolean("defaultPersonalised", false)) { loadFragment(FragmentPersonal()) bottomNav.selectedItemId = R.id.personal toolbarTxt.text = userPlan } else { loadFragment(FragmentPlan()) bottomNav.selectedItemId = R.id.plan toolbarTxt.text = getString(R.string.app_name) } bottomNav.setOnNavigationItemSelectedListener { item: MenuItem -> var fragmentLoading = true lateinit var fragment: Fragment when (item.itemId) { R.id.plan -> { fragment = FragmentPlan() toolbarTxt.text = getString(R.string.app_name) } R.id.personal -> { fragment = FragmentPersonal() toolbarTxt.text = userPlan } R.id.menu -> { fragment = FragmentFood() toolbarTxt.text = getString(R.string.foodmenu) } R.id.openinfopanel -> { if (bottomSheetBehaviour.state == BottomSheetBehavior.STATE_COLLAPSED) { bottomSheetBehaviour.state = BottomSheetBehavior.STATE_EXPANDED } else if (bottomSheetBehaviour.state == BottomSheetBehavior.STATE_EXPANDED) { bottomSheetBehaviour.state = BottomSheetBehavior.STATE_COLLAPSED } fragmentLoading = false } R.id.settings -> { fragment = SettingsFragment() toolbarTxt.text = getString(R.string.settings) } } if (fragmentLoading) { bottomSheetBehaviour.state = BottomSheetBehavior.STATE_COLLAPSED appbarlayout.setExpanded(true) loadFragment(fragment) } else { false } } bottomNav.setOnNavigationItemReselectedListener { item: MenuItem -> when (item.itemId) { R.id.plan, R.id.personal-> { val recyclerView = findViewById(R.id.linearRecycler) recyclerView.post { recyclerView.smoothScrollToPosition(0) bottomSheetBehaviour.state = BottomSheetBehavior.STATE_COLLAPSED } } R.id.menu -> { val recyclerView = findViewById(R.id.linear_food) recyclerView.post { recyclerView.smoothScrollToPosition(0) bottomSheetBehaviour.state = BottomSheetBehavior.STATE_COLLAPSED } } R.id.settings -> { val nsv = findViewById(R.id.nsvsettings) nsv.post { nsv.smoothScrollTo(0, 0) bottomSheetBehaviour.state = BottomSheetBehavior.STATE_COLLAPSED } } } appbarlayout.setExpanded(true) } } } private fun loadFragment(fragment: Fragment): Boolean { supportFragmentManager.beginTransaction().replace(R.id.fragment_container, fragment).commit() return true } private fun notificationJob() { val componentName = ComponentName(this, ScheduledJobService::class.java) val info = JobInfo.Builder(42, componentName) .setRequiresCharging(false) .setPersisted(true) .setPeriodic(900000) .build() val scheduler = getSystemService(JOB_SCHEDULER_SERVICE) as JobScheduler scheduler.schedule(info) } override fun onBackPressed() { if (bottomSheetBehaviour.state == BottomSheetBehavior.STATE_EXPANDED) { bottomSheetBehaviour.state = BottomSheetBehavior.STATE_COLLAPSED } else { super.onBackPressed() } } }