Skip to content

Commit a81b7cb

Browse files
committed
add launcher settings widget
1 parent 22f9a4b commit a81b7cb

File tree

12 files changed

+252
-98
lines changed

12 files changed

+252
-98
lines changed

app/src/main/java/com/amazon/tv/leanbacklauncher/MainActivity.kt

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ import com.amazon.tv.leanbacklauncher.clock.ClockView
4747
import com.amazon.tv.leanbacklauncher.logging.LeanbackLauncherEventLogger
4848
import com.amazon.tv.leanbacklauncher.notifications.*
4949
import com.amazon.tv.leanbacklauncher.notifications.NotificationRowView.NotificationRowListener
50+
import com.amazon.tv.leanbacklauncher.settings.LegacyHomeScreenSettingsActivity
51+
import com.amazon.tv.leanbacklauncher.settings.SettingsActivity
5052
import com.amazon.tv.leanbacklauncher.util.*
5153
import com.amazon.tv.leanbacklauncher.wallpaper.LauncherWallpaper
5254
import com.amazon.tv.leanbacklauncher.wallpaper.WallpaperInstaller
@@ -58,6 +60,7 @@ import java.util.*
5860
import kotlin.math.abs
5961
import kotlin.math.roundToInt
6062

63+
6164
class MainActivity : Activity(), OnEditModeChangedListener, OnEditModeUninstallPressedListener {
6265
private val TAG =
6366
if (BuildConfig.DEBUG) ("*" + javaClass.simpleName).take(21) else javaClass.simpleName
@@ -1060,6 +1063,31 @@ class MainActivity : Activity(), OnEditModeChangedListener, OnEditModeUninstallP
10601063
}
10611064
if (!success) {
10621065
clearWidget(appWidgetId)
1066+
// launcher settings
1067+
wrap.addView(LayoutInflater.from(this).inflate(R.layout.widget_settings, wrap, false))
1068+
val settingsVG: ViewGroup? = findViewById<View>(R.id.settings) as LinearLayout?
1069+
settingsVG?.let { group ->
1070+
val sel = findViewById<ImageView>(R.id.settings_selection_circle)
1071+
val icon = findViewById<ImageView>(R.id.settings_icon)
1072+
group.setOnClickListener {
1073+
startSettings(it)
1074+
}
1075+
group.setOnFocusChangeListener { v, hasFocus ->
1076+
if (hasFocus) {
1077+
sel?.alpha = 1.0f
1078+
icon?.clearAnimation()
1079+
icon?.alpha = 1.0f
1080+
} else {
1081+
sel?.alpha = 0.0f
1082+
icon?.alpha = 0.5f
1083+
icon?.breath()
1084+
}
1085+
}
1086+
sel?.alpha = 0.0f
1087+
icon?.alpha = 0.5f
1088+
icon?.breath()
1089+
}
1090+
// clock
10631091
wrap.addView(LayoutInflater.from(this).inflate(R.layout.clock, wrap, false))
10641092
val typeface = ResourcesCompat.getFont(this, R.font.sfuidisplay_thin)
10651093
val clockview: TextView? = findViewById<View>(R.id.clock) as ClockView?
@@ -1079,6 +1107,18 @@ class MainActivity : Activity(), OnEditModeChangedListener, OnEditModeUninstallP
10791107
}
10801108
}
10811109

1110+
fun startSettings(v: View) {
1111+
if (applicationContext.resources.getBoolean(R.bool.full_screen_settings_enabled)) {
1112+
val intent = Intent(this@MainActivity, LegacyHomeScreenSettingsActivity::class.java)
1113+
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
1114+
startActivity(intent)
1115+
} else if (applicationContext.resources.getBoolean(R.bool.side_panel_settings_enabled)) {
1116+
val intent = Intent(this@MainActivity, SettingsActivity::class.java)
1117+
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
1118+
startActivity(intent)
1119+
}
1120+
}
1121+
10821122
private fun clearWidget(appWidgetId: Int) {
10831123
if (appWidgetId != 0) {
10841124
mAppWidgetHost?.deleteAppWidgetId(appWidgetId)

app/src/main/java/com/amazon/tv/leanbacklauncher/SearchOrbView.kt

Lines changed: 68 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,7 @@ class SearchOrbView(context: Context, attrs: AttributeSet?) : FrameLayout(contex
120120

121121
private val isKatnissPackagePresent: Boolean
122122
get() {
123-
val info: PackageInfo?
124-
info = try {
123+
val info: PackageInfo? = try {
125124
mContext.packageManager.getPackageInfo("com.google.android.katniss", 0)
126125
} catch (e: PackageManager.NameNotFoundException) {
127126
null
@@ -133,12 +132,12 @@ class SearchOrbView(context: Context, attrs: AttributeSet?) : FrameLayout(contex
133132
super.onFinishInflate()
134133
mWidgetView = findViewById(R.id.widget_wrapper)
135134
mMicOrbView = findViewById(R.id.mic_orb)
136-
mMicOrbView?.setOnFocusChangeListener(OnFocusChangeListener { v, hasFocus ->
135+
mMicOrbView?.onFocusChangeListener = OnFocusChangeListener { v, hasFocus ->
137136
setSearchState(false)
138137
if (mAssistantIcon != null) {
139-
mMicOrbView?.setOrbIcon(if (hasFocus) mDefaultColorMicIcon else mAssistantIcon)
138+
mMicOrbView?.orbIcon = if (hasFocus) mDefaultColorMicIcon else mAssistantIcon
140139
}
141-
})
140+
}
142141
initializeSearchOrbs()
143142
initTextSwitcher(context)
144143
}
@@ -173,37 +172,46 @@ class SearchOrbView(context: Context, attrs: AttributeSet?) : FrameLayout(contex
173172
val keyboardOrbView = v as SearchOrbView
174173
keyboardOrbView.orbIcon = if (hasFocus) mKeyboardFocusedIcon else mKeyboardUnfocusedIcon
175174
keyboardOrbView.orbColor = if (hasFocus) mColorBright else mColorDim
176-
if (hasFocus) {
177-
mMicOrbView?.orbIcon = mMicUnfocusedIcon
178-
} else if (mAssistantIcon != null) {
179-
mMicOrbView?.orbIcon = mAssistantIcon
180-
} else {
181-
mMicOrbView?.orbIcon = mDefaultColorMicIcon
175+
when {
176+
hasFocus -> {
177+
mMicOrbView?.orbIcon = mMicUnfocusedIcon
178+
}
179+
mAssistantIcon != null -> {
180+
mMicOrbView?.orbIcon = mAssistantIcon
181+
}
182+
else -> {
183+
mMicOrbView?.orbIcon = mDefaultColorMicIcon
184+
}
182185
}
183186
}
184187
mOrbAnimation = ObjectAnimator.ofFloat(this, "keyboardOrbProgress", 0.0f)
185-
mOrbAnimation?.setDuration(mKeyboardOrbAnimationDuration.toLong())
188+
mOrbAnimation?.duration = mKeyboardOrbAnimationDuration.toLong()
186189
} else {
187190
mKeyboardFocusedIcon = null
188191
mKeyboardUnfocusedIcon = null
189192
mKeyboardOrbView = null
190193
mKeyboardContainer = null
191194
}
192195
val partnerSearchIcon = Partner.get(mContext).customSearchIcon
193-
if (mAssistantIcon != null) {
194-
mMicOrbView?.orbIcon = mAssistantIcon
195-
mMicOrbView?.orbColor = mColorBright
196-
mMicOrbView?.enableOrbColorAnimation(false)
197-
} else if (partnerSearchIcon != null) {
198-
mMicOrbView?.orbIcon = partnerSearchIcon
199-
} else if (mWahlbergUx) {
200-
mMicOrbView?.orbColor = mColorBright
201-
mMicOrbView?.orbIcon = mDefaultColorMicIcon
202-
mMicOrbView?.enableOrbColorAnimation(false)
203-
} else {
204-
mMicOrbView?.orbColors = SearchOrbView.Colors(ContextCompat.getColor(mContext, R.color.search_orb_bg_color_old), ContextCompat.getColor(mContext, R.color.search_orb_bg_bright_color_old))
205-
mMicOrbView?.orbIcon = ContextCompat.getDrawable(mContext, R.drawable.ic_search_mic_out_normal)
206-
mMicOrbView?.enableOrbColorAnimation(true)
196+
when {
197+
mAssistantIcon != null -> {
198+
mMicOrbView?.orbIcon = mAssistantIcon
199+
mMicOrbView?.orbColor = mColorBright
200+
mMicOrbView?.enableOrbColorAnimation(false)
201+
}
202+
partnerSearchIcon != null -> {
203+
mMicOrbView?.orbIcon = partnerSearchIcon
204+
}
205+
mWahlbergUx -> {
206+
mMicOrbView?.orbColor = mColorBright
207+
mMicOrbView?.orbIcon = mDefaultColorMicIcon
208+
mMicOrbView?.enableOrbColorAnimation(false)
209+
}
210+
else -> {
211+
mMicOrbView?.orbColors = SearchOrbView.Colors(ContextCompat.getColor(mContext, R.color.search_orb_bg_color_old), ContextCompat.getColor(mContext, R.color.search_orb_bg_bright_color_old))
212+
mMicOrbView?.orbIcon = ContextCompat.getDrawable(mContext, R.drawable.ic_search_mic_out_normal)
213+
mMicOrbView?.enableOrbColorAnimation(true)
214+
}
207215
}
208216
viewTreeObserver.addOnGlobalLayoutListener { setKeyboardOrbProgress(mKeyboardOrbProgress) }
209217
}
@@ -221,8 +229,7 @@ class SearchOrbView(context: Context, attrs: AttributeSet?) : FrameLayout(contex
221229
val i = if (focused) if (!isKeyboard) -2 else -3 else -1
222230
mCurrentIndex = i
223231
if (old != mCurrentIndex) {
224-
val useFade: Boolean
225-
useFade = old != -1 && mCurrentIndex != -1
232+
val useFade: Boolean = old != -1 && mCurrentIndex != -1
226233
val z: Boolean = !isReset
227234
configSwitcher(z, focused, if (useFade) 2 else 1)
228235
if (mWahlbergUx) {
@@ -250,7 +257,7 @@ class SearchOrbView(context: Context, attrs: AttributeSet?) : FrameLayout(contex
250257

251258
private fun initTextSwitcher(context: Context) {
252259
mSwitcher = findViewById(R.id.text_switcher)
253-
mSwitcher?.setAnimateFirstView(false)
260+
mSwitcher?.animateFirstView = false
254261
mSwitcher?.setFactory(object : ViewSwitcher.ViewFactory {
255262
var inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
256263
override fun makeView(): View {
@@ -264,7 +271,7 @@ class SearchOrbView(context: Context, attrs: AttributeSet?) : FrameLayout(contex
264271
if (old == mCurrentIndex) {
265272
mCurrentIndex = (mCurrentIndex + 1) % mTextToShow.size
266273
}
267-
configSwitcher(true, false, 0)
274+
configSwitcher(switchViews = true, focused = false, animType = 0)
268275
mSwitcher?.setText(fixItalics(mTextToShow[mCurrentIndex]))
269276
mHandler.postDelayed(this, mIdleTextFlipDelay.toLong())
270277
}
@@ -290,19 +297,22 @@ class SearchOrbView(context: Context, attrs: AttributeSet?) : FrameLayout(contex
290297
val outAnim: Int
291298
val v = if (switchViews) mSwitcher!!.nextView else mSwitcher!!.currentView
292299
if (v is TextView) {
293-
val textView = v
294-
textView.setTextColor(if (focused) mFocusedColor else mUnfocusedColor)
295-
textView.setTypeface(null, Typeface.ITALIC)
300+
v.setTextColor(if (focused) mFocusedColor else mUnfocusedColor)
301+
v.setTypeface(null, Typeface.ITALIC)
296302
}
297-
if (animType == 1) {
298-
inAnim = R.anim.slide_in_left
299-
outAnim = R.anim.slide_out_right
300-
} else if (animType == 0) {
301-
inAnim = R.anim.slide_in_bottom
302-
outAnim = R.anim.slide_out_top
303-
} else {
304-
inAnim = R.anim.fade_in
305-
outAnim = R.anim.fade_out
303+
when (animType) {
304+
1 -> {
305+
inAnim = R.anim.slide_in_left
306+
outAnim = R.anim.slide_out_right
307+
}
308+
0 -> {
309+
inAnim = R.anim.slide_in_bottom
310+
outAnim = R.anim.slide_out_top
311+
}
312+
else -> {
313+
inAnim = R.anim.fade_in
314+
outAnim = R.anim.fade_out
315+
}
306316
}
307317
mSwitcher!!.setInAnimation(mContext, inAnim)
308318
mSwitcher!!.setOutAnimation(mContext, outAnim)
@@ -341,7 +351,7 @@ class SearchOrbView(context: Context, attrs: AttributeSet?) : FrameLayout(contex
341351
searchOrbView!!.enableOrbColorAnimation(z)
342352
}
343353

344-
private fun setVisibile(visible: Boolean) {
354+
private fun setVisible(visible: Boolean) {
345355
animateVisibility(mWidgetView, visible)
346356
animateVisibility(mSwitcher, visible)
347357
}
@@ -377,30 +387,28 @@ class SearchOrbView(context: Context, attrs: AttributeSet?) : FrameLayout(contex
377387
}
378388
}
379389

380-
private fun setKeyboardOrbProgress(prog: Float) {
381-
val focusable: Boolean
382-
val visible: Boolean
390+
private fun setKeyboardOrbProgress(progress: Float) {
383391
var i = 0
384392
var i2 = 1
385-
focusable = prog.toDouble() == 1.0
386-
visible = prog > 0.0f
387-
mKeyboardOrbProgress = prog
393+
val focusable: Boolean = progress.toDouble() == 1.0
394+
val visible: Boolean = progress > 0.0f
395+
mKeyboardOrbProgress = progress
388396
if (mKeyboardOrbView != null) {
389397
mKeyboardOrbView!!.isFocusable = focusable
390-
mKeyboardOrbView!!.alpha = prog
398+
mKeyboardOrbView!!.alpha = progress
391399
val frameLayout = mKeyboardContainer
392400
if (!visible) {
393401
i = INVISIBLE
394402
}
395403
frameLayout!!.visibility = i
396-
mKeyboardContainer!!.scaleX = prog
397-
mKeyboardContainer!!.scaleY = prog
404+
mKeyboardContainer!!.scaleX = progress
405+
mKeyboardContainer!!.scaleY = progress
398406
val orbWidth = mKeyboardOrbView!!.measuredWidth
399407
if (layoutDirection != LAYOUT_DIRECTION_RTL) {
400408
i2 = -1
401409
}
402-
val offset = (i2 * (mSearchOrbsSpacing + orbWidth)).toFloat() * (1.0f - prog)
403-
mKeyboardOrbView!!.translationX = offset / prog
410+
val offset = (i2 * (mSearchOrbsSpacing + orbWidth)).toFloat() * (1.0f - progress)
411+
mKeyboardOrbView!!.translationX = offset / progress
404412
if (mSwitcher != null) {
405413
mSwitcher!!.translationX = offset
406414
}
@@ -415,7 +423,7 @@ class SearchOrbView(context: Context, attrs: AttributeSet?) : FrameLayout(contex
415423
public override fun onAttachedToWindow() {
416424
var isTouchExplorationEnabled = true
417425
super.onAttachedToWindow()
418-
setVisibile(true)
426+
setVisible(true)
419427
val am = mContext.getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager
420428
if (!(am.isEnabled && am.isTouchExplorationEnabled)) {
421429
isTouchExplorationEnabled = false
@@ -461,22 +469,22 @@ class SearchOrbView(context: Context, attrs: AttributeSet?) : FrameLayout(contex
461469
}
462470

463471
fun animateIn() {
464-
setVisibile(true)
472+
setVisible(true)
465473
}
466474

467475
private fun animateOut() {
468-
setVisibile(false)
476+
setVisible(false)
469477
reset()
470478
}
471479

472480
override fun setActivated(active: Boolean) {}
473481

474482
fun updateSearchSuggestions(suggestions: Array<String>?) {
475483
mCurrentIndex = 0
476-
if (suggestions == null || suggestions.size == 0) {
477-
mTextToShow = mDefaultTextToShow
484+
mTextToShow = if (suggestions == null || suggestions.isEmpty()) {
485+
mDefaultTextToShow
478486
} else {
479-
mTextToShow = suggestions
487+
suggestions
480488
}
481489
}
482490

app/src/main/java/com/amazon/tv/leanbacklauncher/apps/LaunchPointList.kt

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -660,39 +660,39 @@ class LaunchPointList(ctx: Context) {
660660
settingsItems.add(lp)
661661
}
662662
}
663-
// LAUNCHER SETTINGS // 4
664-
if (mContext.resources.getBoolean(R.bool.full_screen_settings_enabled)) {
665-
val setIntent = Intent()
666-
setIntent.action = "com.amazon.tv.leanbacklauncher.SETTINGS"
667-
setIntent.component =
668-
ComponentName.unflattenFromString(mContext.packageName + "/.settings.LegacyHomeScreenSettingsActivity")
669-
lp = LaunchPoint(
670-
mContext,
671-
mContext.getString(R.string.launcher_settings),
672-
ContextCompat.getDrawable(mContext, R.drawable.ic_settings_launcher),
673-
setIntent,
674-
ContextCompat.getColor(mContext, R.color.settings_dialog_bg_protection)
675-
)
676-
lp.addLaunchIntentFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
677-
lp.settingsType = SettingsType.APP_CONFIGURE.code
678-
lp.priority = -4
679-
settingsItems.add(lp)
680-
}
681-
if (mContext.resources.getBoolean(R.bool.side_panel_settings_enabled)) {
682-
val ssIntent = Intent()
683-
ssIntent.component =
684-
ComponentName.unflattenFromString(mContext.packageName + "/.settings.SettingsActivity")
685-
val info = pkgMan.resolveActivity(
686-
ssIntent,
687-
PackageManager.GET_ACTIVITIES or PackageManager.GET_META_DATA
688-
)
689-
if (info?.activityInfo != null) {
690-
lp = LaunchPoint(mContext, pkgMan, info, false, SettingsType.APP_CONFIGURE.code)
691-
lp.addLaunchIntentFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
692-
lp.priority = -4
693-
settingsItems.add(lp)
694-
}
695-
}
663+
// // LAUNCHER SETTINGS // 4
664+
// if (mContext.resources.getBoolean(R.bool.full_screen_settings_enabled)) {
665+
// val setIntent = Intent()
666+
// setIntent.action = "com.amazon.tv.leanbacklauncher.SETTINGS"
667+
// setIntent.component =
668+
// ComponentName.unflattenFromString(mContext.packageName + "/.settings.LegacyHomeScreenSettingsActivity")
669+
// lp = LaunchPoint(
670+
// mContext,
671+
// mContext.getString(R.string.launcher_settings),
672+
// ContextCompat.getDrawable(mContext, R.drawable.ic_settings_launcher),
673+
// setIntent,
674+
// ContextCompat.getColor(mContext, R.color.settings_dialog_bg_protection)
675+
// )
676+
// lp.addLaunchIntentFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
677+
// lp.settingsType = SettingsType.APP_CONFIGURE.code
678+
// lp.priority = -4
679+
// settingsItems.add(lp)
680+
// }
681+
// if (mContext.resources.getBoolean(R.bool.side_panel_settings_enabled)) {
682+
// val ssIntent = Intent()
683+
// ssIntent.component =
684+
// ComponentName.unflattenFromString(mContext.packageName + "/.settings.SettingsActivity")
685+
// val info = pkgMan.resolveActivity(
686+
// ssIntent,
687+
// PackageManager.GET_ACTIVITIES or PackageManager.GET_META_DATA
688+
// )
689+
// if (info?.activityInfo != null) {
690+
// lp = LaunchPoint(mContext, pkgMan, info, false, SettingsType.APP_CONFIGURE.code)
691+
// lp.addLaunchIntentFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
692+
// lp.priority = -4
693+
// settingsItems.add(lp)
694+
// }
695+
// }
696696

697697
// NOTIFICATIONS // 3
698698
if (FireTVUtils.isAmazonNotificationsEnabled(mContext)) {

0 commit comments

Comments
 (0)