diff --git a/app/src/main/java/org/fossasia/susi/ai/chat/ChatActivity.kt b/app/src/main/java/org/fossasia/susi/ai/chat/ChatActivity.kt index 81c9d8365..bca3bfb4e 100644 --- a/app/src/main/java/org/fossasia/susi/ai/chat/ChatActivity.kt +++ b/app/src/main/java/org/fossasia/susi/ai/chat/ChatActivity.kt @@ -65,7 +65,7 @@ import timber.log.Timber * Created by chiragw15 on 9/7/17. */ @Suppress("UNUSED_PARAMETER", "DEPRECATION") -class ChatActivity : AppCompatActivity(), IChatView { +class ChatActivity : AppCompatActivity(), IChatView, ChatCallback { private val chatPresenter: IChatPresenter by inject { parametersOf(this) } lateinit var youtubeVid: IYoutubeVid @@ -90,6 +90,7 @@ class ChatActivity : AppCompatActivity(), IChatView { } } + @SuppressLint("RestrictedApi") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_chat) @@ -316,7 +317,7 @@ class ChatActivity : AppCompatActivity(), IChatView { rv_chat_feed.layoutManager = linearLayoutManager rv_chat_feed.setHasFixedSize(false) - recyclerAdapter = ChatFeedRecyclerAdapter(this, chatMessageDatabaseList, true) + recyclerAdapter = ChatFeedRecyclerAdapter(this, chatMessageDatabaseList, true, this) rv_chat_feed.adapter = recyclerAdapter rv_chat_feed.addOnLayoutChangeListener { _, _, _, _, bottom, _, _, _, oldBottom -> @@ -364,6 +365,7 @@ class ChatActivity : AppCompatActivity(), IChatView { } // Take user's speech as input and send the message + @SuppressLint("RestrictedApi") override fun promptSpeechInput() { if (recordingThread != null) { chatPresenter.stopHotwordDetection() @@ -379,6 +381,7 @@ class ChatActivity : AppCompatActivity(), IChatView { } // Replies user with Speech + @SuppressLint("RestrictedApi") override fun voiceReply(reply: String, language: String) { searchChat.visibility = View.VISIBLE fabsetting.visibility = View.VISIBLE @@ -631,12 +634,20 @@ class ChatActivity : AppCompatActivity(), IChatView { chatPresenter.checkPreferences() } - override fun playVideo(videoId: String) { + override fun playVideo(videoId: String?) { Timber.d(videoId) - youtubeVid.playYoutubeVid(videoId) + var bundle = Bundle() + bundle.putString("video", videoId) + var youtubeFragment = YoutubeFragment.newInstance() + youtubeFragment.arguments = bundle + supportFragmentManager.beginTransaction().add(R.id.coordinator_layout, youtubeFragment, "youtube").commit() } companion object { val ALARM = "ALARM" } + + override fun onYoutubeClicked(videoId: String?) { + playVideo(videoId) + } } diff --git a/app/src/main/java/org/fossasia/susi/ai/chat/ChatCallback.kt b/app/src/main/java/org/fossasia/susi/ai/chat/ChatCallback.kt new file mode 100644 index 000000000..9c31a26a2 --- /dev/null +++ b/app/src/main/java/org/fossasia/susi/ai/chat/ChatCallback.kt @@ -0,0 +1,5 @@ +package org.fossasia.susi.ai.chat + +interface ChatCallback { + fun onYoutubeClicked(videoId: String?) +} diff --git a/app/src/main/java/org/fossasia/susi/ai/chat/ChatPresenter.kt b/app/src/main/java/org/fossasia/susi/ai/chat/ChatPresenter.kt index e7857007d..324ed2ce1 100644 --- a/app/src/main/java/org/fossasia/susi/ai/chat/ChatPresenter.kt +++ b/app/src/main/java/org/fossasia/susi/ai/chat/ChatPresenter.kt @@ -68,7 +68,6 @@ class ChatPresenter(context: Context, private val chatView: IChatView?) : var id: Long = 0 var identifier: String = "" var tableItem: TableItem? = null - private val youtubeVid: IYoutubeVid = YoutubeVid(context) private var textToSpeech: TextToSpeech? = null private val context: Context = context private lateinit var handler: Handler @@ -503,7 +502,7 @@ class ChatPresenter(context: Context, private val chatView: IChatView?) : } else if (parseSusiHelper.actionType == Constant.VIDEOPLAY || parseSusiHelper.actionType == Constant.AUDIOPLAY) { // Play youtube video identifier = parseSusiHelper.identifier - youtubeVid.playYoutubeVid(identifier) + chatView?.playVideo(identifier) } else if (parseSusiHelper.actionType == Constant.ANSWER && (PrefManager.checkSpeechOutputPref() && check || PrefManager.checkSpeechAlwaysPref())) { setMessage = parseSusiHelper.answer try { diff --git a/app/src/main/java/org/fossasia/susi/ai/chat/YoutubeFragment.kt b/app/src/main/java/org/fossasia/susi/ai/chat/YoutubeFragment.kt new file mode 100644 index 000000000..0b01919ac --- /dev/null +++ b/app/src/main/java/org/fossasia/susi/ai/chat/YoutubeFragment.kt @@ -0,0 +1,75 @@ +package org.fossasia.susi.ai.chat + +import android.content.pm.PackageManager +import android.os.Bundle +import android.support.v4.app.Fragment +import android.support.v4.app.FragmentTransaction +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.google.android.youtube.player.YouTubeInitializationResult +import com.google.android.youtube.player.YouTubePlayer +import com.google.android.youtube.player.YouTubePlayerSupportFragment +import org.fossasia.susi.ai.R +import org.fossasia.susi.ai.chat.listeners.FullscreenListener + +class YoutubeFragment : Fragment() { + private var API_KEY: String? = null + private var m_RootView: View? = null + private var m_StopButton: View? = null + var YPlayer: YouTubePlayer? = null + private var VIDEO: String = "" + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + var rootView = inflater.inflate(R.layout.fragment_youtube, container, false) + m_RootView = rootView + m_StopButton = m_RootView?.findViewById(R.id.youtube_stop_btn) + var bundle = activity?.packageManager?.getApplicationInfo(activity?.applicationContext?.packageName, PackageManager.GET_META_DATA)?.metaData + API_KEY = bundle?.getString("com.google.android.youtube.API_KEY") + if (arguments != null) { + VIDEO = arguments!!.getString("video") + } + m_StopButton?.setOnClickListener({ + YPlayer?.release() + activity?.supportFragmentManager?.beginTransaction()?.remove(this)?.commit() + }) + initYoutube() + return rootView + } + + private fun initYoutube() { + val youTubePlayerFragment: YouTubePlayerSupportFragment = + YouTubePlayerSupportFragment.newInstance() + val transaction: FragmentTransaction = childFragmentManager.beginTransaction() + transaction.add(R.id.youtube_fragment, youTubePlayerFragment as Fragment) + transaction.commit() + youTubePlayerFragment.initialize(API_KEY, object : YouTubePlayer.OnInitializedListener { + + override fun onInitializationSuccess( + provider: YouTubePlayer.Provider?, + player: YouTubePlayer, + wasRestored: Boolean + ) { + if (!wasRestored) { + YPlayer = player + YPlayer?.loadVideo(VIDEO) + YPlayer?.setOnFullscreenListener(FullscreenListener(activity, this@YoutubeFragment)) + YPlayer?.play() + } + } + + override fun onInitializationFailure( + arg0: YouTubePlayer.Provider?, + arg1: YouTubeInitializationResult? + ) { + } + }) + } + companion object { + fun newInstance() = YoutubeFragment() + } +} diff --git a/app/src/main/java/org/fossasia/susi/ai/chat/adapters/recycleradapters/ChatFeedRecyclerAdapter.kt b/app/src/main/java/org/fossasia/susi/ai/chat/adapters/recycleradapters/ChatFeedRecyclerAdapter.kt index 6d6ff39fb..6988dfc5d 100644 --- a/app/src/main/java/org/fossasia/susi/ai/chat/adapters/recycleradapters/ChatFeedRecyclerAdapter.kt +++ b/app/src/main/java/org/fossasia/susi/ai/chat/adapters/recycleradapters/ChatFeedRecyclerAdapter.kt @@ -21,6 +21,7 @@ import io.realm.RealmRecyclerViewAdapter import io.realm.RealmResults import java.util.ArrayList import org.fossasia.susi.ai.R +import org.fossasia.susi.ai.chat.ChatCallback import org.fossasia.susi.ai.chat.adapters.viewholders.ChatViewHolder import org.fossasia.susi.ai.chat.adapters.viewholders.DateViewHolder import org.fossasia.susi.ai.chat.adapters.viewholders.ImageViewHolder @@ -43,7 +44,8 @@ import org.fossasia.susi.ai.helper.ConstraintsHelper class ChatFeedRecyclerAdapter( private val currContext: Context, data: OrderedRealmCollection?, - autoUpdate: Boolean + autoUpdate: Boolean, + private val chatCallback: ChatCallback ) : RealmRecyclerViewAdapter(data, autoUpdate), MessageViewHolder.ClickListener { private var realm: Realm? = null @@ -163,11 +165,11 @@ class ChatFeedRecyclerAdapter( STOP -> return nullHolder AUDIOPLAY -> { view = inflater.inflate(R.layout.youtube_video, viewGroup, false) - return YoutubeVideoViewHolder(view, clickListener) + return YoutubeVideoViewHolder(view, clickListener, chatCallback) } VIDEOPLAY -> { view = inflater.inflate(R.layout.youtube_video, viewGroup, false) - return YoutubeVideoViewHolder(view, clickListener) + return YoutubeVideoViewHolder(view, clickListener, chatCallback) } IMAGE -> { view = inflater.inflate(R.layout.image_holder, viewGroup, false) diff --git a/app/src/main/java/org/fossasia/susi/ai/chat/adapters/viewholders/YoutubeVideoViewHolder.kt b/app/src/main/java/org/fossasia/susi/ai/chat/adapters/viewholders/YoutubeVideoViewHolder.kt index df01fe580..54d1bd698 100644 --- a/app/src/main/java/org/fossasia/susi/ai/chat/adapters/viewholders/YoutubeVideoViewHolder.kt +++ b/app/src/main/java/org/fossasia/susi/ai/chat/adapters/viewholders/YoutubeVideoViewHolder.kt @@ -6,7 +6,7 @@ import android.widget.ImageView import com.squareup.picasso.Picasso import kotterknife.bindView import org.fossasia.susi.ai.R -import org.fossasia.susi.ai.chat.YoutubeVid +import org.fossasia.susi.ai.chat.ChatCallback import org.fossasia.susi.ai.data.model.ChatMessage import timber.log.Timber @@ -15,7 +15,8 @@ import timber.log.Timber */ class YoutubeVideoViewHolder( view: View, - clickListener: MessageViewHolder.ClickListener + clickListener: MessageViewHolder.ClickListener, + private val callback: ChatCallback ) : MessageViewHolder(view, clickListener) { @@ -41,8 +42,8 @@ class YoutubeVideoViewHolder( Timber.e(e) } } - - val youtubeVid = YoutubeVid(itemView.context) - playButton.setOnClickListener { videoId?.let { id -> youtubeVid.playYoutubeVid(id) } } + playButton.setOnClickListener { + callback.onYoutubeClicked(videoId) + } } } diff --git a/app/src/main/java/org/fossasia/susi/ai/chat/contract/IChatView.kt b/app/src/main/java/org/fossasia/susi/ai/chat/contract/IChatView.kt index bab1f314f..562237291 100644 --- a/app/src/main/java/org/fossasia/susi/ai/chat/contract/IChatView.kt +++ b/app/src/main/java/org/fossasia/susi/ai/chat/contract/IChatView.kt @@ -29,5 +29,5 @@ interface IChatView { fun promptSpeechInput() fun finishActivity() fun stopMic() - fun playVideo(videoId: String) + fun playVideo(videoId: String?) } diff --git a/app/src/main/java/org/fossasia/susi/ai/chat/listeners/FullscreenListener.kt b/app/src/main/java/org/fossasia/susi/ai/chat/listeners/FullscreenListener.kt new file mode 100644 index 000000000..7fb106b6d --- /dev/null +++ b/app/src/main/java/org/fossasia/susi/ai/chat/listeners/FullscreenListener.kt @@ -0,0 +1,22 @@ +package org.fossasia.susi.ai.chat.listeners + +import android.content.pm.ActivityInfo +import android.support.v4.app.FragmentActivity +import com.google.android.youtube.player.YouTubePlayer +import org.fossasia.susi.ai.chat.YoutubeFragment + +class FullscreenListener : YouTubePlayer.OnFullscreenListener { + private var mContext: FragmentActivity? = null + private var mFragment: YoutubeFragment? = null + + constructor(context: FragmentActivity?, fragment: YoutubeFragment?) { + mContext = context + mFragment = fragment + } + + override fun onFullscreen(p0: Boolean) { + if (!p0) { + mContext?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT + } + } +} diff --git a/app/src/main/res/layout/fragment_youtube.xml b/app/src/main/res/layout/fragment_youtube.xml new file mode 100644 index 000000000..ede46cc6a --- /dev/null +++ b/app/src/main/res/layout/fragment_youtube.xml @@ -0,0 +1,22 @@ + + +