diff --git a/app/src/main/java/com/gh/common/util/EntranceUtils.java b/app/src/main/java/com/gh/common/util/EntranceUtils.java index 2c38cf75fe..8132fcb946 100644 --- a/app/src/main/java/com/gh/common/util/EntranceUtils.java +++ b/app/src/main/java/com/gh/common/util/EntranceUtils.java @@ -113,6 +113,7 @@ public class EntranceUtils { public static final String KEY_SKIP_GAME_COMMENT = "skipGameComment"; public static final String KEY_OPEN_PLATFORM_WINDOW = "openPlatformWindow"; public static final String KEY_OPEN_KEYBOARD = "openKeyboard"; + public static final String KEY_PATH_VIDEO = "pathVideo"; public static void jumpActivity(Context context, Bundle bundle) { diff --git a/app/src/main/java/com/gh/gamecenter/video/MyDraftAdapter.kt b/app/src/main/java/com/gh/gamecenter/video/MyDraftAdapter.kt index ec7899015b..af6cf63e42 100644 --- a/app/src/main/java/com/gh/gamecenter/video/MyDraftAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/video/MyDraftAdapter.kt @@ -1,22 +1,51 @@ package com.gh.gamecenter.video import android.content.Context +import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView +import com.gh.common.constant.ItemViewType +import com.gh.gamecenter.R +import com.gh.gamecenter.adapter.viewholder.FooterViewHolder import com.gh.gamecenter.baselist.ListAdapter +import com.gh.gamecenter.databinding.VideoItemBinding import com.gh.gamecenter.entity.VideoEntity +import com.gh.gamecenter.qa.newest.AskQuestionsNewViewHolder + +class MyDraftAdapter(context: Context, + private val mViewModel: MyDraftViewModel) : ListAdapter(context) { + + override fun getItemViewType(position: Int): Int { + if (position == itemCount - 1) { + return ItemViewType.ITEM_FOOTER + } + return ItemViewType.ITEM_BODY + } -class MyDraftAdapter(context: Context) : ListAdapter(context) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + val view: View + return when (viewType) { + ItemViewType.ITEM_FOOTER -> { + view = mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false) + FooterViewHolder(view) + } + else -> { + view = mLayoutInflater.inflate(R.layout.video_item, parent, false) + return VideoItemViewHolder(VideoItemBinding.bind(view)) + } + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder is VideoItemViewHolder) { + + } else if (holder is FooterViewHolder) { + holder.initFooterViewHolder(mViewModel, mIsLoading, mIsNetworkError, mIsOver) + } } override fun getItemCount(): Int { return if (mEntityList.size > 0) mEntityList.size + 1 else 0 } - override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - } - } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/video/MyDraftFragment.kt b/app/src/main/java/com/gh/gamecenter/video/MyDraftFragment.kt index f491a70dd8..3caf9c6e9a 100644 --- a/app/src/main/java/com/gh/gamecenter/video/MyDraftFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/video/MyDraftFragment.kt @@ -1,5 +1,6 @@ package com.gh.gamecenter.video +import android.os.Bundle import com.gh.gamecenter.baselist.ListFragment import com.gh.gamecenter.entity.VideoEntity @@ -9,9 +10,8 @@ class MyDraftFragment : ListFragment() { override fun provideListAdapter(): MyDraftAdapter { if (mAdapter == null) { - mAdapter = MyDraftAdapter(context!!) + mAdapter = MyDraftAdapter(context!!, mListViewModel) } return mAdapter!! } - } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/video/MyDraftViewModel.kt b/app/src/main/java/com/gh/gamecenter/video/MyDraftViewModel.kt index 4ba8fc69c2..523619d964 100644 --- a/app/src/main/java/com/gh/gamecenter/video/MyDraftViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/video/MyDraftViewModel.kt @@ -1,9 +1,11 @@ package com.gh.gamecenter.video import android.app.Application +import androidx.lifecycle.Observer import com.gh.gamecenter.baselist.ListFragment import com.gh.gamecenter.baselist.ListViewModel import com.gh.gamecenter.baselist.NormalListViewModel +import com.gh.gamecenter.entity.MessageEntity import com.gh.gamecenter.entity.VideoEntity import io.reactivex.Observable @@ -14,6 +16,6 @@ class MyDraftViewModel(application: Application) : ListViewModel>(mListLiveData) { mResultLiveData.postValue(it) } } - } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/video/MyVideoAdapter.kt b/app/src/main/java/com/gh/gamecenter/video/MyVideoAdapter.kt index a9192a02af..4d56625a42 100644 --- a/app/src/main/java/com/gh/gamecenter/video/MyVideoAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/video/MyVideoAdapter.kt @@ -1,22 +1,48 @@ package com.gh.gamecenter.video import android.content.Context +import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView +import com.gh.common.constant.ItemViewType +import com.gh.gamecenter.R +import com.gh.gamecenter.adapter.viewholder.FooterViewHolder import com.gh.gamecenter.baselist.ListAdapter +import com.gh.gamecenter.databinding.VideoItemBinding import com.gh.gamecenter.entity.VideoEntity -class MyVideoAdapter(context: Context) : ListAdapter(context) { +class MyVideoAdapter(context: Context, + private val mViewModel: MyVideoViewModel) : ListAdapter(context) { + override fun getItemViewType(position: Int): Int { + if (position == itemCount - 1) { + return ItemViewType.ITEM_FOOTER + } + return ItemViewType.ITEM_BODY + } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + val view: View + return when (viewType) { + ItemViewType.ITEM_FOOTER -> { + view = mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false) + FooterViewHolder(view) + } + else -> { + view = mLayoutInflater.inflate(R.layout.video_item, parent, false) + return VideoItemViewHolder(VideoItemBinding.bind(view)) + } + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder is VideoItemViewHolder) { + + } else if (holder is FooterViewHolder) { + holder.initFooterViewHolder(mViewModel, mIsLoading, mIsNetworkError, mIsOver) + } } override fun getItemCount(): Int { return if (mEntityList.size > 0) mEntityList.size + 1 else 0 } - - override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - } - } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/video/MyVideoFragment.kt b/app/src/main/java/com/gh/gamecenter/video/MyVideoFragment.kt index f9d027d76e..2291bd42d4 100644 --- a/app/src/main/java/com/gh/gamecenter/video/MyVideoFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/video/MyVideoFragment.kt @@ -9,7 +9,7 @@ class MyVideoFragment : ListFragment() { override fun provideListAdapter(): MyVideoAdapter { if (mAdapter == null) { - mAdapter = MyVideoAdapter(context!!) + mAdapter = MyVideoAdapter(context!!, mListViewModel) } return mAdapter!! } diff --git a/app/src/main/java/com/gh/gamecenter/video/MyVideoViewModel.kt b/app/src/main/java/com/gh/gamecenter/video/MyVideoViewModel.kt index 5a800e6aae..556fbf1587 100644 --- a/app/src/main/java/com/gh/gamecenter/video/MyVideoViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/video/MyVideoViewModel.kt @@ -12,7 +12,6 @@ class MyVideoViewModel(application: Application) : ListViewModel>(mListLiveData) { mResultLiveData.postValue(it) } } - } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/video/VideoManagerActivity.kt b/app/src/main/java/com/gh/gamecenter/video/VideoManagerActivity.kt index 114f4aa6cd..3706c1c50e 100644 --- a/app/src/main/java/com/gh/gamecenter/video/VideoManagerActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/video/VideoManagerActivity.kt @@ -11,21 +11,23 @@ import com.gh.base.BaseActivity import com.gh.base.BaseActivity_TabLayout import com.gh.common.util.EntranceUtils import com.gh.gamecenter.R -import com.gh.gamecenter.qa.article.edit.ArticleEditActivity import com.gh.gamecenter.video.upload.UploadVideoActivity import com.zhihu.matisse.Matisse import com.zhihu.matisse.MimeType +import com.zhihu.matisse.internal.utils.PathUtils class VideoManagerActivity : BaseActivity_TabLayout() { - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) - if (REQUEST_CODE_VIDEO == requestCode) { - startActivity(UploadVideoActivity.getIntent(this, mEntrance, "视频投稿")) + if (REQUEST_CODE_VIDEO == requestCode && data != null) { + val uris = Matisse.obtainResult(data) + if (uris.size > 0) { + val videoPath = PathUtils.getPath(this, uris[0]) + startActivity(UploadVideoActivity.getIntent(this, videoPath, mEntrance, "视频投稿")) + } } - } override fun onCreate(savedInstanceState: Bundle?) { @@ -42,9 +44,9 @@ class VideoManagerActivity : BaseActivity_TabLayout() { override fun onMenuItemClick(item: MenuItem): Boolean { if (item.itemId == R.id.menu_text) { Matisse.from(this) - .choose(MimeType.ofVideo()) + .choose(MimeType.of(MimeType.MP4)) .countable(true) - .maxSelectable(10) + .maxSelectable(1) .showSingleMediaType(true) .forResult(REQUEST_CODE_VIDEO) } @@ -63,6 +65,7 @@ class VideoManagerActivity : BaseActivity_TabLayout() { companion object { const val REQUEST_CODE_VIDEO = 111 + @JvmStatic fun getIntent(context: Context, entrance: String, path: String): Intent { val intent = Intent(context, VideoManagerActivity::class.java) diff --git a/app/src/main/java/com/gh/gamecenter/video/ViewHolder.kt b/app/src/main/java/com/gh/gamecenter/video/ViewHolder.kt new file mode 100644 index 0000000000..1402acccd9 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/video/ViewHolder.kt @@ -0,0 +1,5 @@ +package com.gh.gamecenter.video + +import com.gh.base.BaseRecyclerViewHolder + +class VideoItemViewHolder(binding: com.gh.gamecenter.databinding.VideoItemBinding) : BaseRecyclerViewHolder(binding.root) \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/video/upload/UploadManager.kt b/app/src/main/java/com/gh/gamecenter/video/upload/UploadManager.kt index b21a8fd794..df42056c03 100644 --- a/app/src/main/java/com/gh/gamecenter/video/upload/UploadManager.kt +++ b/app/src/main/java/com/gh/gamecenter/video/upload/UploadManager.kt @@ -70,7 +70,6 @@ class UploadManager { resumableTask.waitUntilFinished() } - @SuppressLint("CheckResult") private fun getOssConfig() { RetrofitManager.getInstance(HaloApp.getInstance().application) diff --git a/app/src/main/java/com/gh/gamecenter/video/upload/UploadVideoActivity.kt b/app/src/main/java/com/gh/gamecenter/video/upload/UploadVideoActivity.kt index 5f01ea7d50..166a3eef27 100644 --- a/app/src/main/java/com/gh/gamecenter/video/upload/UploadVideoActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/video/upload/UploadVideoActivity.kt @@ -1,8 +1,11 @@ package com.gh.gamecenter.video.upload +import android.app.Activity import android.content.Context import android.content.Intent +import android.media.ThumbnailUtils import android.os.Bundle +import android.provider.MediaStore import android.text.SpannableStringBuilder import android.text.Spanned import android.text.TextPaint @@ -13,12 +16,17 @@ import android.view.View import android.widget.TextView import androidx.lifecycle.ViewModelProviders import com.gh.base.BaseActivity +import com.gh.base.BaseRichEditorActivity import com.gh.common.util.EntranceUtils +import com.gh.common.util.TextHelper import com.gh.common.util.fromHtml import com.gh.common.util.setTextChangedListener import com.gh.gamecenter.R import com.gh.gamecenter.WebActivity import com.gh.gamecenter.databinding.ActivityVideoUplaodBinding +import com.gh.gamecenter.entity.GameEntity +import com.gh.gamecenter.qa.editor.GameActivity +import java.util.* class UploadVideoActivity : BaseActivity() { @@ -30,6 +38,15 @@ class UploadVideoActivity : BaseActivity() { return R.layout.activity_video_uplaod } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == REQUEST_GAME_CODE && resultCode == Activity.RESULT_OK) { + mViewModel.gameEntity = data?.getParcelableExtra(GameEntity::class.java.simpleName) + mBinding.gameName.text = mViewModel.gameEntity?.name + mBinding.gameName.setTextColor(resources.getColor(R.color.text_333333)) + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -44,14 +61,20 @@ class UploadVideoActivity : BaseActivity() { mBinding.gameNameHint.text = resources.getString(R.string.upload_game_name_hint).fromHtml() mBinding.gameTitleHint.text = resources.getString(R.string.upload_game_title_hint).fromHtml() mBinding.gameCategoryHint.text = resources.getString(R.string.upload_game_category_hint).fromHtml() - mBinding.titleCounter.setTextChangedListener(action = { s, _, _, _ -> - mBinding.titleCounter.text = ("(" + s.length + "/100)") + mBinding.gameTitle.filters = arrayOf(TextHelper.getFilter(100, "最多输入100个字")) + + mBinding.gameTitle.setTextChangedListener(action = { s, _, _, _ -> + mBinding.titleCounter.text = (s.length.toString() + "/100") }) + mBinding.gameName.setOnClickListener { + startActivityForResult(GameActivity.getIntent(this), REQUEST_GAME_CODE) + } uploadProtocolHandle() mViewModel = ViewModelProviders.of(this).get(UploadVideoViewModel::class.java) + initUpload() } override fun onMenuItemClick(item: MenuItem): Boolean { @@ -90,11 +113,22 @@ class UploadVideoActivity : BaseActivity() { mBinding.updateProtocol.movementMethod = LinkMovementMethod() } + private fun initUpload() { + val videoPath = intent.getStringExtra(EntranceUtils.KEY_PATH_VIDEO) + Objects.requireNonNull(videoPath) + + val thumbnail = ThumbnailUtils.createVideoThumbnail(videoPath, MediaStore.Images.Thumbnails.MINI_KIND) + mBinding.videoCover.setImageBitmap(thumbnail) + } + companion object { - fun getIntent(context: Context, entrance: String, path: String): Intent { + private const val REQUEST_GAME_CODE = 116 + + fun getIntent(context: Context, videoPath: String, entrance: String, path: String): Intent { val intent = Intent(context, UploadVideoActivity::class.java) intent.putExtra(EntranceUtils.KEY_ENTRANCE, mergeEntranceAndPath(entrance, path)) + intent.putExtra(EntranceUtils.KEY_PATH_VIDEO, videoPath) return intent } } diff --git a/app/src/main/java/com/gh/gamecenter/video/upload/UploadVideoViewModel.kt b/app/src/main/java/com/gh/gamecenter/video/upload/UploadVideoViewModel.kt index b9a532be4a..beb18dcfc0 100644 --- a/app/src/main/java/com/gh/gamecenter/video/upload/UploadVideoViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/video/upload/UploadVideoViewModel.kt @@ -2,7 +2,10 @@ package com.gh.gamecenter.video.upload import android.app.Application import androidx.lifecycle.AndroidViewModel +import com.gh.gamecenter.entity.GameEntity class UploadVideoViewModel(application: Application) : AndroidViewModel(application) { + var gameEntity: GameEntity? = null + } \ No newline at end of file diff --git a/app/src/main/res/drawable-xxhdpi/video_status_bg.png b/app/src/main/res/drawable-xxhdpi/video_status_bg.png new file mode 100644 index 0000000000..2bb8c971f4 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/video_status_bg.png differ diff --git a/app/src/main/res/layout/activity_video_uplaod.xml b/app/src/main/res/layout/activity_video_uplaod.xml index 8214086718..12753d3776 100644 --- a/app/src/main/res/layout/activity_video_uplaod.xml +++ b/app/src/main/res/layout/activity_video_uplaod.xml @@ -1,5 +1,6 @@ + + app:layout_constraintRight_toLeftOf="@id/video_cover" /> + app:layout_constraintTop_toBottomOf="@id/game_category_line" /> + app:layout_constraintTop_toBottomOf="@id/game_tag_line" + tools:text="@string/upload_protocol" /> + + + + + + + + + + diff --git a/libraries/Matisse/src/main/java/com/zhihu/matisse/internal/model/SelectedItemCollection.java b/libraries/Matisse/src/main/java/com/zhihu/matisse/internal/model/SelectedItemCollection.java index edbab42f1a..02fc1df02d 100644 --- a/libraries/Matisse/src/main/java/com/zhihu/matisse/internal/model/SelectedItemCollection.java +++ b/libraries/Matisse/src/main/java/com/zhihu/matisse/internal/model/SelectedItemCollection.java @@ -168,11 +168,9 @@ public class SelectedItemCollection { public IncapableCause isAcceptable(Item item) { if (maxSelectableReached()) { int maxSelectable = currentMaxSelectable(); - String cause = mContext.getString( - R.string.error_over_count, - maxSelectable - ); - + int hintRes = mCollectionType == COLLECTION_VIDEO ? + R.string.error_over_count_video : R.string.error_over_count; + String cause = mContext.getString(hintRes, maxSelectable); return new IncapableCause(cause); } else if (typeConflict(item)) { return new IncapableCause(mContext.getString(R.string.error_type_conflict)); diff --git a/libraries/Matisse/src/main/res/values/strings.xml b/libraries/Matisse/src/main/res/values/strings.xml index 2e9e2a90be..b2c3f18559 100644 --- a/libraries/Matisse/src/main/res/values/strings.xml +++ b/libraries/Matisse/src/main/res/values/strings.xml @@ -27,6 +27,7 @@ 您已经达到最大选择数量 一次最多选择%1$d张图片 + 一次最多选择%1$d个视频 图片质量太低 图片质量太高 不支持的文件类型