diff --git a/app/build.gradle b/app/build.gradle
index ef19c0a03c..b9342eecab 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -255,9 +255,14 @@ dependencies {
implementation "top.zibin:Luban:${luban}"
- // for video streaming
+ implementation "com.squareup.picasso:picasso:${picasso}"
+
+ // for video streaming TODO 用 GSY 替换掉上面的这个 jiaozi
implementation "cn.jzvd:jiaozivideoplayer:${jiaoziVideoView}"
- implementation "com.danikula:videocache:${videoCache}"
+ implementation 'com.shuyu:gsyVideoPlayer-java:7.1.0'
+ implementation 'com.shuyu:gsyVideoPlayer-armv7a:7.1.0'
+ implementation 'com.shuyu:gsyVideoPlayer-x86:7.1.0'
+ implementation 'androidx.viewpager2:viewpager2:1.0.0-beta03'
implementation "android.arch.work:work-runtime:${workManager}"
diff --git a/app/proguard-rules.txt b/app/proguard-rules.txt
index 0297c62be7..d2e0077db8 100644
--- a/app/proguard-rules.txt
+++ b/app/proguard-rules.txt
@@ -230,4 +230,14 @@
#阿里云上传
-keep class com.alibaba.sdk.android.oss.** { *; }
-dontwarn okio.**
--dontwarn org.apache.commons.codec.binary.**
\ No newline at end of file
+-dontwarn org.apache.commons.codec.binary.**
+
+#视频相关
+-keep class com.shuyu.gsyvideoplayer.video.** { *; }
+-dontwarn com.shuyu.gsyvideoplayer.video.**
+-keep class com.shuyu.gsyvideoplayer.video.base.** { *; }
+-dontwarn com.shuyu.gsyvideoplayer.video.base.**
+-keep class com.shuyu.gsyvideoplayer.utils.** { *; }
+-dontwarn com.shuyu.gsyvideoplayer.utils.**
+-keep class tv.danmaku.ijk.** { *; }
+-dontwarn tv.danmaku.ijk.**
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f7bcf36553..4e592678eb 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -32,6 +32,14 @@
+
+
@@ -391,6 +399,10 @@
android:theme = "@style/Theme.Transparent"
android:windowSoftInputMode = "adjustNothing" />
+
+
= 19 && Build.VERSION.SDK_INT < 21) {
+ setWindowFlag(activity, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
+ | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, true);
+ }
+ if (Build.VERSION.SDK_INT >= 19) {
+ activity.getWindow().getDecorView().setSystemUiVisibility(
+ View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+ | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+ | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+ );
+ }
+ if (Build.VERSION.SDK_INT >= 21) {
+ setWindowFlag(activity, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
+ | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, false);
+ activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
+ activity.getWindow().setNavigationBarColor(Color.TRANSPARENT);
+ }
+ }
+
+ private static void setWindowFlag(Activity activity, final int bits, boolean on) {
+ Window win = activity.getWindow();
+ WindowManager.LayoutParams winParams = win.getAttributes();
+ if (on) {
+ winParams.flags |= bits;
+ } else {
+ winParams.flags &= ~bits;
+ }
+ win.setAttributes(winParams);
+ }
+
}
diff --git a/app/src/main/java/com/gh/common/util/Extensions.kt b/app/src/main/java/com/gh/common/util/Extensions.kt
index 71cf6d22b0..3ae7ec31d4 100644
--- a/app/src/main/java/com/gh/common/util/Extensions.kt
+++ b/app/src/main/java/com/gh/common/util/Extensions.kt
@@ -11,18 +11,18 @@ import android.view.Gravity
import android.view.View
import android.widget.PopupWindow
import android.widget.TextView
-import androidx.annotation.ColorInt
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.*
import androidx.viewpager.widget.ViewPager
+import com.gh.common.constant.Config
+import com.gh.gamecenter.BuildConfig
import com.gh.gamecenter.R
import com.google.gson.reflect.TypeToken
import com.halo.assistant.HaloApp
import com.lightgame.utils.Utils
import okhttp3.MediaType
import okhttp3.RequestBody
-import org.json.JSONArray
import java.net.URI
/**
@@ -302,4 +302,19 @@ fun TextView.setTextChangedListener(action: (s: CharSequence, start: Int, before
fun Int.toColor() : Int{
return HaloApp.getInstance().application.resources.getColor(this)
+}
+
+/**
+ * 测试用包裹
+ */
+inline fun debugOnly(f: () -> Unit) {
+ if (BuildConfig.DEBUG) {
+ f()
+ }
+}
+
+inline fun testChannelOnly(f: () -> Unit) {
+ if (HaloApp.getInstance().channel == Config.DEFAULT_CHANNEL) {
+ f()
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/gh/common/view/StatusBarView.kt b/app/src/main/java/com/gh/common/view/StatusBarView.kt
new file mode 100644
index 0000000000..d7178305ef
--- /dev/null
+++ b/app/src/main/java/com/gh/common/view/StatusBarView.kt
@@ -0,0 +1,18 @@
+package com.gh.common.view
+
+import android.content.Context
+import android.os.Build
+import android.util.AttributeSet
+import android.view.View
+import com.gh.common.util.DisplayUtils
+
+class StatusBarView @JvmOverloads constructor(context: Context?, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : View(context, attrs, defStyleAttr) {
+ override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
+ val height = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
+ 0
+ } else {
+ DisplayUtils.getStatusBarHeight(resources)
+ }
+ setMeasuredDimension(View.MeasureSpec.getSize(widthMeasureSpec), height)
+ }
+}
diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameGalleryAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameGalleryAdapter.kt
index 350772e638..e134603f2f 100644
--- a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameGalleryAdapter.kt
+++ b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameGalleryAdapter.kt
@@ -14,12 +14,11 @@ import butterknife.BindView
import cn.jzvd.JzvdStd
import com.facebook.drawee.view.SimpleDraweeView
import com.gh.base.BaseRecyclerViewHolder
-import com.gh.common.util.DataCollectionUtils
-import com.gh.common.util.DataUtils
-import com.gh.common.util.ImageUtils
+import com.gh.common.util.*
import com.gh.gamecenter.R
import com.gh.gamecenter.ViewImageActivity
import com.gh.gamecenter.databinding.GalleryVideoItemBinding
+import com.gh.gamecenter.video.detail.VideoDetailActivity
import com.halo.assistant.HaloApp
import kotlinx.android.synthetic.main.player_view.view.*
import java.util.*
@@ -66,6 +65,15 @@ class GameGalleryAdapter(var context: Context,
holder.adapterPosition, mEntrance)
context.startActivity(intent)
}
+
+ testChannelOnly {
+ holder.itemView.setOnLongClickListener {
+ consume {
+ val intent = VideoDetailActivity.getIntent(context)
+ context.startActivity(intent)
+ }
+ }
+ }
}
is VideoViewHolder -> {
ImageUtils.display(holder.binding.playerView.thumb, mGallery[position])
diff --git a/app/src/main/java/com/gh/gamecenter/qa/follow/AskFollowMoreDialog.kt b/app/src/main/java/com/gh/gamecenter/qa/follow/AskFollowMoreDialog.kt
index 140661572b..65d00a80ec 100644
--- a/app/src/main/java/com/gh/gamecenter/qa/follow/AskFollowMoreDialog.kt
+++ b/app/src/main/java/com/gh/gamecenter/qa/follow/AskFollowMoreDialog.kt
@@ -2,14 +2,14 @@ package com.gh.gamecenter.qa.follow
import android.app.Activity
import android.content.Context
-import androidx.databinding.DataBindingUtil
import android.graphics.Point
import android.os.Bundle
-import androidx.recyclerview.widget.LinearLayoutManager
-import androidx.recyclerview.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import androidx.databinding.DataBindingUtil
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
import com.gh.base.fragment.BaseDialogFragment
import com.gh.gamecenter.PersonalHomeActivity
import com.gh.gamecenter.R
@@ -29,7 +29,7 @@ class AskFollowMoreDialog : BaseDialogFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
- dialog.setCanceledOnTouchOutside(true)
+ dialog?.setCanceledOnTouchOutside(true)
val lp = container.layoutParams
lp.width = ((getScreenWidth(requireActivity())) * 0.8).toInt()
diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditActivity.kt
index 3b7951fd3e..690856e0fe 100644
--- a/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditActivity.kt
+++ b/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditActivity.kt
@@ -3,18 +3,17 @@ package com.gh.gamecenter.qa.questions.edit
import android.annotation.SuppressLint
import android.app.Activity
import android.app.Dialog
-import androidx.lifecycle.Observer
-import androidx.lifecycle.ViewModelProviders
import android.content.Context
import android.content.Intent
-import androidx.databinding.DataBindingUtil
import android.os.Bundle
-import androidx.recyclerview.widget.GridLayoutManager
import android.text.Editable
import android.text.TextWatcher
import android.view.KeyEvent
import android.view.MenuItem
import android.widget.EditText
+import androidx.databinding.DataBindingUtil
+import androidx.lifecycle.Observer
+import androidx.lifecycle.ViewModelProviders
import com.gh.base.BaseActivity
import com.gh.base.fragment.BaseDialogWrapperFragment
import com.gh.base.fragment.WaitingDialogFragment
@@ -263,11 +262,11 @@ class QuestionEditActivity : BaseActivity() {
super.onDestroy()
}
- override fun onSaveInstanceState(outState: Bundle?) {
+ override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
- outState?.putString(mSaveTitleKey, mViewModel.title)
- outState?.putString(mSaveContentKey, mViewModel.content)
- outState?.putStringArrayList(mSaveImagesKey, mViewModel.picList.value as java.util.ArrayList?)
+ outState.putString(mSaveTitleKey, mViewModel.title)
+ outState.putString(mSaveContentKey, mViewModel.content)
+ outState.putStringArrayList(mSaveImagesKey, mViewModel.picList.value as java.util.ArrayList?)
}
// Limits of EditText
diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt b/app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt
new file mode 100644
index 0000000000..bf6a8972cd
--- /dev/null
+++ b/app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt
@@ -0,0 +1,109 @@
+package com.gh.gamecenter.video.detail
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.Surface
+import android.view.View
+import android.widget.ImageView
+import com.gh.gamecenter.R
+import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer
+import com.shuyu.gsyvideoplayer.video.base.GSYVideoView
+import com.squareup.picasso.Picasso
+
+class DetailPlayerView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null)
+ : StandardGSYVideoPlayer(context, attrs) {
+
+ override fun init(context: Context) {
+ super.init(context)
+
+ if (mThumbImageViewLayout != null && (mCurrentState == -1 || mCurrentState == GSYVideoView.CURRENT_STATE_NORMAL || mCurrentState == GSYVideoView.CURRENT_STATE_ERROR)) {
+ mThumbImageViewLayout.visibility = View.VISIBLE
+ }
+ }
+
+ fun updateThumb(url: String) {
+ Picasso.with(context).load(url)
+ .into(findViewById(R.id.thumbImage))
+ }
+
+ override fun getLayoutId(): Int {
+ return R.layout.layout_simple_player
+ }
+
+ /******************* 下方两个重载方法,在播放开始前不屏蔽封面,不需要可屏蔽 ********************/
+
+ override fun onSurfaceUpdated(surface: Surface) {
+ super.onSurfaceUpdated(surface)
+ if (mThumbImageViewLayout != null && mThumbImageViewLayout.visibility == View.VISIBLE) {
+ mThumbImageViewLayout.visibility = View.INVISIBLE
+ }
+ }
+
+ override fun setViewShowState(view: View?, visibility: Int) {
+ if (view === mThumbImageViewLayout && visibility != View.VISIBLE) {
+ return
+ }
+ super.setViewShowState(view, visibility)
+ }
+
+ /********************************各类UI的状态显示*********************************************/
+
+ override fun hideAllWidget() {
+ super.hideAllWidget()
+ setViewShowState(mBottomProgressBar, View.VISIBLE)
+ }
+
+ override fun changeUiToNormal() {
+ super.changeUiToNormal()
+ setViewShowState(mStartButton, View.INVISIBLE)
+ setViewShowState(mBottomProgressBar, View.VISIBLE)
+ }
+
+ override fun changeUiToPreparingShow() {
+ super.changeUiToPreparingShow()
+ }
+
+ override fun changeUiToPlayingShow() {
+ super.changeUiToPlayingShow()
+ setViewShowState(mStartButton, View.INVISIBLE)
+ setViewShowState(mBottomProgressBar, View.VISIBLE)
+ }
+
+ override fun changeUiToPauseShow() {
+ super.changeUiToPauseShow()
+ setViewShowState(mStartButton, View.VISIBLE)
+ setViewShowState(mBottomProgressBar, View.VISIBLE)
+ }
+
+ override fun changeUiToPlayingBufferingShow() {
+ super.changeUiToPlayingBufferingShow()
+ setViewShowState(mBottomProgressBar, View.VISIBLE)
+ }
+
+ override fun changeUiToCompleteShow() {
+ super.changeUiToCompleteShow()
+ setViewShowState(mBottomProgressBar, View.VISIBLE)
+ }
+
+ override fun updateStartImage() {
+ // no need to change
+ }
+
+ override fun touchDoubleUp() {
+ // we don't need double tap to stop
+ }
+
+ override fun changeUiToPauseClear() {
+ // we don't need to hide play icon
+ }
+
+ override fun onClick(v: View) {
+ val id = v.id
+ if (id == R.id.surface_container) {
+ clickStartIcon()
+ } else {
+ super.onClick(v)
+ }
+ }
+}
+
diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailActivity.kt b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailActivity.kt
new file mode 100644
index 0000000000..3d6dab5c15
--- /dev/null
+++ b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailActivity.kt
@@ -0,0 +1,33 @@
+package com.gh.gamecenter.video.detail
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import com.gh.base.BaseActivity
+import com.gh.common.util.DisplayUtils
+import com.gh.gamecenter.R
+
+class VideoDetailActivity : BaseActivity() {
+
+ override fun getLayoutId(): Int {
+ return R.layout.activity_video_detail
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ DisplayUtils.transparentStatusAndNavigation(this)
+
+ val containerFragment = VideoDetailContainerFragment()
+
+ supportFragmentManager.beginTransaction().replace(R.id.placeholder, containerFragment).commitNowAllowingStateLoss()
+ }
+
+ companion object {
+ fun getIntent(context: Context): Intent {
+ val intent = Intent(context, VideoDetailActivity::class.java)
+ return intent
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt
new file mode 100644
index 0000000000..1c61dc5705
--- /dev/null
+++ b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt
@@ -0,0 +1,38 @@
+package com.gh.gamecenter.video.detail
+
+import android.os.Bundle
+import android.view.View
+import androidx.viewpager2.widget.ViewPager2
+import com.gh.gamecenter.R
+import com.gh.gamecenter.normal.NormalFragment
+import kotlinx.android.synthetic.main.fragment_video_detail_container.*
+
+class VideoDetailContainerFragment : NormalFragment() {
+
+ private lateinit var mFragmentAdapter: VideoFragmentPagerAdapter
+
+ override fun getLayoutId(): Int {
+ return R.layout.fragment_video_detail_container
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+ toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_material)
+ toolbar.setNavigationOnClickListener {
+ requireActivity().finish()
+ }
+
+ mFragmentAdapter = VideoFragmentPagerAdapter(this)
+
+ mFragmentAdapter.videoList = arrayListOf(
+ "https://resource.ghzs.com/video/game/5cef8c58bb946d11052dfe65.mp4",
+ "https://resource.ghzs.com/video/game/5d26e984c391ca0c9a16121c.mp4",
+ "https://resource.ghzs.com/video/game/5d53bc8e656a5c05bf59d2e7.mp4")
+
+ viewpager.adapter = mFragmentAdapter
+ viewpager.orientation = ViewPager2.ORIENTATION_VERTICAL
+ viewpager.offscreenPageLimit = 1
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailFragment.kt
new file mode 100644
index 0000000000..eedbb72dc4
--- /dev/null
+++ b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailFragment.kt
@@ -0,0 +1,57 @@
+package com.gh.gamecenter.video.detail
+
+import android.os.Bundle
+import android.util.Log
+import android.view.View
+import butterknife.BindView
+import com.gh.gamecenter.R
+import com.gh.gamecenter.normal.NormalFragment
+import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder
+
+class VideoDetailFragment : NormalFragment() {
+
+ private var videoUrl = ""
+
+ @BindView(R.id.video)
+ lateinit var videoView: DetailPlayerView
+
+ override fun getLayoutId(): Int {
+ return R.layout.fragment_video_detail
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+ GSYVideoOptionBuilder()
+ .setIsTouchWiget(false)
+ .setUrl(videoUrl)
+ .setRotateViewAuto(false)
+ .setCacheWithPlay(true)
+ .setRotateViewAuto(false)
+ .setRotateWithSystem(false)
+ .setReleaseWhenLossAudio(true)
+ .setLockLand(true)
+ .setLooping(true)
+ .build(videoView)
+
+ videoView.updateThumb("$videoUrl?x-oss-process=video/snapshot,t_0,f_jpg,w_0,h_0")
+ }
+
+ override fun onResume() {
+ super.onResume()
+ videoView.startPlayLogic()
+ Log.d("lifeCycle", "onResume")
+ }
+
+ override fun onPause() {
+ super.onPause()
+ Log.d("lifeCycle", "onPause")
+ }
+
+ companion object {
+ fun newInstance(url: String): VideoDetailFragment {
+ return VideoDetailFragment().apply { videoUrl = url }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/VideoFragmentPagerAdapter.kt b/app/src/main/java/com/gh/gamecenter/video/detail/VideoFragmentPagerAdapter.kt
new file mode 100644
index 0000000000..4904eb3f90
--- /dev/null
+++ b/app/src/main/java/com/gh/gamecenter/video/detail/VideoFragmentPagerAdapter.kt
@@ -0,0 +1,18 @@
+package com.gh.gamecenter.video.detail
+
+import androidx.fragment.app.Fragment
+import androidx.viewpager2.adapter.FragmentStateAdapter
+
+class VideoFragmentPagerAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) {
+
+ var videoList = arrayListOf()
+
+ override fun getItemCount(): Int {
+ return videoList.size
+ }
+
+ override fun createFragment(position: Int): Fragment {
+ return VideoDetailFragment.newInstance(videoList[position])
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_video_detail.xml b/app/src/main/res/layout/activity_video_detail.xml
new file mode 100644
index 0000000000..bddc4cf451
--- /dev/null
+++ b/app/src/main/res/layout/activity_video_detail.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_video_detail.xml b/app/src/main/res/layout/fragment_video_detail.xml
new file mode 100644
index 0000000000..71794ec600
--- /dev/null
+++ b/app/src/main/res/layout/fragment_video_detail.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_video_detail_container.xml b/app/src/main/res/layout/fragment_video_detail_container.xml
new file mode 100644
index 0000000000..c64feb1ebe
--- /dev/null
+++ b/app/src/main/res/layout/fragment_video_detail_container.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_simple_player.xml b/app/src/main/res/layout/layout_simple_player.xml
new file mode 100644
index 0000000000..cd2ad9b30f
--- /dev/null
+++ b/app/src/main/res/layout/layout_simple_player.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 3040f71f45..ecf7dd69e1 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -1,248 +1,253 @@
-
+
-
+
-
+
-
+
-
+
-
- - 0dp
- - 0dp
- - 0dp
- - fill
- - @color/theme
+
+ - scrollable
-
+
-
+
+
+
-
+
-
+
-
+
-
+ - 16sp
+ - @android:color/white
+ - bold
+
-
+ - italic
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+ - @color/black
+
-
+ - @null
+ - 36dp
+ - 36dp
+
-
+
-
+
-
+
-
+
-
+
-
\ No newline at end of file
+
\ No newline at end of file