-
-
Notifications
You must be signed in to change notification settings - Fork 800
Expand file tree
/
Copy pathDeviceUtil.kt
More file actions
142 lines (125 loc) · 6.12 KB
/
DeviceUtil.kt
File metadata and controls
142 lines (125 loc) · 6.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package org.wikipedia.util
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.content.res.Configuration
import android.content.res.Resources
import android.graphics.Color
import android.net.ConnectivityManager
import android.os.Build
import android.os.Handler
import android.provider.Settings
import android.view.KeyCharacterMap
import android.view.KeyEvent
import android.view.View
import android.view.Window
import android.view.accessibility.AccessibilityManager
import android.view.inputmethod.InputMethodManager
import androidx.activity.enableEdgeToEdge
import androidx.annotation.ColorInt
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import com.google.android.material.appbar.MaterialToolbar
import org.wikipedia.R
import org.wikipedia.WikipediaApp
import kotlin.system.exitProcess
object DeviceUtil {
private inline val Window.insetsControllerCompat
get() = WindowCompat.getInsetsController(this, decorView)
fun showSoftKeyboard(activity: Activity) {
activity.window.insetsControllerCompat.show(WindowInsetsCompat.Type.ime())
}
fun showSoftKeyboard(view: View) {
(view.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager)
.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
}
fun hideSoftKeyboard(activity: Activity) {
activity.window.insetsControllerCompat.hide(WindowInsetsCompat.Type.ime())
}
fun hideSoftKeyboard(view: View) {
(view.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager)
.hideSoftInputFromWindow(view.windowToken, 0)
}
fun isHardKeyboardAttached(resources: Resources): Boolean {
return (resources.configuration.hardKeyboardHidden == Configuration.KEYBOARDHIDDEN_NO &&
resources.configuration.keyboard != Configuration.KEYBOARD_UNDEFINED &&
resources.configuration.keyboard != Configuration.KEYBOARD_NOKEYS)
}
fun setLightSystemUiVisibility(activity: Activity) {
// this make the system recognizes the status bar light and will make status bar icons become visible
// if the theme is not dark
activity.window.insetsControllerCompat.isAppearanceLightStatusBars = !WikipediaApp.instance.currentTheme.isDark
}
fun setNavigationBarColor(window: Window, @ColorInt color: Int) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val isDarkThemeOrDarkBackground = WikipediaApp.instance.currentTheme.isDark ||
color == ContextCompat.getColor(window.context, android.R.color.black)
window.navigationBarColor = color
window.insetsControllerCompat.isAppearanceLightNavigationBars = !isDarkThemeOrDarkBackground
}
}
fun updateStatusBarTheme(activity: Activity, toolbar: MaterialToolbar?, reset: Boolean) {
activity.window.insetsControllerCompat.isAppearanceLightStatusBars = !reset ||
!WikipediaApp.instance.currentTheme.isDark
toolbar?.setNavigationIconTint(if (reset) Color.WHITE else ResourceUtil.getThemedColor(activity, R.attr.primary_color))
}
fun setContextClickAsLongClick(vararg views: View) {
views.forEach {
it.setOnContextClickListener { obj -> obj.performLongClick() }
}
}
/**
* https://issuetracker.google.com/issues/160946170
* There's a platform-specific issue where the app gets launched in "Restricted" mode during a
* backup operation; And if the app crashes during that operation, it remains in Restricted
* mode in subsequent launches, including subsequent user-requested launches. While in this
* mode, the system doesn't actually launch our custom subclassed WikipediaApp object, but
* instead uses a vanilla Application object, which will cause issues when other classes try
* to access static data from the WikipediaApp object.
*
* This is a workaround that explicitly terminates the app process if it's running in Restricted
* mode, to be used sparingly from places where this crash is most likely to occur.
*/
fun assertAppContext(context: Context, terminateOnFail: Boolean = false): Boolean {
if (context.applicationContext !is WikipediaApp) {
if (terminateOnFail) {
Handler(context.mainLooper).post { exitProcess(0) }
}
return false
}
return true
}
fun setEdgeToEdge(activity: AppCompatActivity) {
activity.enableEdgeToEdge()
WindowCompat.getInsetsController(activity.window, activity.window.decorView).isAppearanceLightStatusBars = !WikipediaApp.instance.currentTheme.isDark
}
fun openNotificationSettings(context: Context){
val intent= if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS).apply {
putExtra(Settings.EXTRA_APP_PACKAGE,context.packageName)
}
}else{
Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
data = android.net.Uri.fromParts("package", context.packageName, null)
}
}
context.startActivity(intent as? Intent)
}
val isOnWiFi: Boolean
get() {
val info = (WikipediaApp.instance.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager)
.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
return info != null && info.isConnected
}
// TODO: revisit this if there's no more navigation bar by default.
val isNavigationBarShowing
get() = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK) && KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_HOME)
val isAccessibilityEnabled: Boolean
get() {
val am = WikipediaApp.instance.getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager
// TODO: add more logic if other accessibility tools have different settings.
return am.isEnabled && am.isTouchExplorationEnabled
}
}