11package org.schabi.newpipe.local.subscription
22
33import android.app.Activity
4- import android.content.BroadcastReceiver
54import android.content.Context
65import android.content.DialogInterface
76import android.content.Intent
8- import android.content.IntentFilter
97import android.os.Bundle
108import android.os.Parcelable
119import android.view.LayoutInflater
1210import android.view.Menu
1311import android.view.MenuInflater
12+ import android.view.MenuItem
13+ import android.view.SubMenu
1414import android.view.View
1515import android.view.ViewGroup
1616import android.widget.Toast
1717import androidx.activity.result.ActivityResult
1818import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult
19+ import androidx.annotation.StringRes
1920import androidx.appcompat.app.AlertDialog
2021import androidx.lifecycle.ViewModelProvider
21- import androidx.localbroadcastmanager.content.LocalBroadcastManager
2222import androidx.recyclerview.widget.GridLayoutManager
2323import com.xwray.groupie.Group
2424import com.xwray.groupie.GroupAdapter
@@ -34,6 +34,7 @@ import org.schabi.newpipe.databinding.FeedItemCarouselBinding
3434import org.schabi.newpipe.databinding.FragmentSubscriptionBinding
3535import org.schabi.newpipe.error.ErrorInfo
3636import org.schabi.newpipe.error.UserAction
37+ import org.schabi.newpipe.extractor.ServiceList
3738import org.schabi.newpipe.extractor.channel.ChannelInfoItem
3839import org.schabi.newpipe.fragments.BaseStateFragment
3940import org.schabi.newpipe.ktx.animate
@@ -45,20 +46,18 @@ import org.schabi.newpipe.local.subscription.item.EmptyPlaceholderItem
4546import org.schabi.newpipe.local.subscription.item.FeedGroupAddItem
4647import org.schabi.newpipe.local.subscription.item.FeedGroupCardItem
4748import org.schabi.newpipe.local.subscription.item.FeedGroupCarouselItem
48- import org.schabi.newpipe.local.subscription.item.FeedImportExportItem
4949import org.schabi.newpipe.local.subscription.item.HeaderWithMenuItem
5050import org.schabi.newpipe.local.subscription.item.HeaderWithMenuItem.Companion.PAYLOAD_UPDATE_VISIBILITY_MENU_ITEM
5151import org.schabi.newpipe.local.subscription.services.SubscriptionsExportService
52- import org.schabi.newpipe.local.subscription.services.SubscriptionsExportService.EXPORT_COMPLETE_ACTION
5352import org.schabi.newpipe.local.subscription.services.SubscriptionsImportService
54- import org.schabi.newpipe.local.subscription.services.SubscriptionsImportService.IMPORT_COMPLETE_ACTION
5553import org.schabi.newpipe.local.subscription.services.SubscriptionsImportService.KEY_MODE
5654import org.schabi.newpipe.local.subscription.services.SubscriptionsImportService.KEY_VALUE
5755import org.schabi.newpipe.local.subscription.services.SubscriptionsImportService.PREVIOUS_EXPORT_MODE
5856import org.schabi.newpipe.streams.io.NoFileManagerSafeGuard
5957import org.schabi.newpipe.streams.io.StoredFileHelper
6058import org.schabi.newpipe.util.NavigationHelper
6159import org.schabi.newpipe.util.OnClickGesture
60+ import org.schabi.newpipe.util.ServiceHelper
6261import org.schabi.newpipe.util.ThemeHelper.getGridSpanCountChannels
6362import org.schabi.newpipe.util.ThemeHelper.shouldUseGridLayout
6463import org.schabi.newpipe.util.external_communication.ShareUtils
@@ -74,12 +73,9 @@ class SubscriptionFragment : BaseStateFragment<SubscriptionState>() {
7473 private lateinit var subscriptionManager: SubscriptionManager
7574 private val disposables: CompositeDisposable = CompositeDisposable ()
7675
77- private var subscriptionBroadcastReceiver: BroadcastReceiver ? = null
78-
7976 private val groupAdapter = GroupAdapter <GroupieViewHolder <FeedItemCarouselBinding >>()
8077 private val feedGroupsSection = Section ()
8178 private var feedGroupsCarousel: FeedGroupCarouselItem ? = null
82- private lateinit var importExportItem: FeedImportExportItem
8379 private lateinit var feedGroupsSortMenuItem: HeaderWithMenuItem
8480 private val subscriptionsSection = Section ()
8581
@@ -91,12 +87,10 @@ class SubscriptionFragment : BaseStateFragment<SubscriptionState>() {
9187 @State
9288 @JvmField
9389 var itemsListState: Parcelable ? = null
90+
9491 @State
9592 @JvmField
9693 var feedGroupsListState: Parcelable ? = null
97- @State
98- @JvmField
99- var importExportItemExpandedState: Boolean? = null
10094
10195 init {
10296 setHasOptionsMenu(true )
@@ -120,20 +114,10 @@ class SubscriptionFragment : BaseStateFragment<SubscriptionState>() {
120114 return inflater.inflate(R .layout.fragment_subscription, container, false )
121115 }
122116
123- override fun onResume () {
124- super .onResume()
125- setupBroadcastReceiver()
126- }
127-
128117 override fun onPause () {
129118 super .onPause()
130119 itemsListState = binding.itemsList.layoutManager?.onSaveInstanceState()
131120 feedGroupsListState = feedGroupsCarousel?.onSaveInstanceState()
132- importExportItemExpandedState = importExportItem.isExpanded
133-
134- if (subscriptionBroadcastReceiver != null && activity != null ) {
135- LocalBroadcastManager .getInstance(activity).unregisterReceiver(subscriptionBroadcastReceiver!! )
136- }
137121 }
138122
139123 override fun onDestroy () {
@@ -150,28 +134,61 @@ class SubscriptionFragment : BaseStateFragment<SubscriptionState>() {
150134
151135 activity.supportActionBar?.setDisplayShowTitleEnabled(true )
152136 activity.supportActionBar?.setTitle(R .string.tab_subscriptions)
137+
138+ buildImportExportMenu(menu)
153139 }
154140
155- private fun setupBroadcastReceiver () {
156- if (activity == null ) return
141+ private fun buildImportExportMenu (menu : Menu ) {
142+ // -- Import --
143+ val importSubMenu = menu.addSubMenu(R .string.import_from)
157144
158- if (subscriptionBroadcastReceiver != null ) {
159- LocalBroadcastManager .getInstance(activity).unregisterReceiver(subscriptionBroadcastReceiver!! )
160- }
145+ addMenuItemToSubmenu(importSubMenu, R .string.previous_export) { onImportPreviousSelected() }
146+ .setIcon(R .drawable.ic_backup)
161147
162- val filters = IntentFilter ()
163- filters.addAction(EXPORT_COMPLETE_ACTION )
164- filters.addAction(IMPORT_COMPLETE_ACTION )
165- subscriptionBroadcastReceiver = object : BroadcastReceiver () {
166- override fun onReceive (context : Context , intent : Intent ) {
167- _binding ?.itemsList?.post {
168- importExportItem.isExpanded = false
169- importExportItem.notifyChanged(FeedImportExportItem .REFRESH_EXPANDED_STATUS )
170- }
148+ for (service in ServiceList .all()) {
149+ val subscriptionExtractor = service.subscriptionExtractor ? : continue
150+
151+ val supportedSources = subscriptionExtractor.supportedSources
152+ if (supportedSources.isEmpty()) continue
153+
154+ addMenuItemToSubmenu(importSubMenu, service.serviceInfo.name) {
155+ onImportFromServiceSelected(service.serviceId)
171156 }
157+ .setIcon(ServiceHelper .getIcon(service.serviceId))
172158 }
173159
174- LocalBroadcastManager .getInstance(activity).registerReceiver(subscriptionBroadcastReceiver!! , filters)
160+ // -- Export --
161+ val exportSubMenu = menu.addSubMenu(R .string.export_to)
162+
163+ addMenuItemToSubmenu(exportSubMenu, R .string.file) { onExportSelected() }
164+ .setIcon(R .drawable.ic_save)
165+ }
166+
167+ private fun addMenuItemToSubmenu (
168+ subMenu : SubMenu ,
169+ @StringRes title : Int ,
170+ onClick : Runnable
171+ ): MenuItem {
172+ return setClickListenerToMenuItem(subMenu.add(title), onClick)
173+ }
174+
175+ private fun addMenuItemToSubmenu (
176+ subMenu : SubMenu ,
177+ title : String ,
178+ onClick : Runnable
179+ ): MenuItem {
180+ return setClickListenerToMenuItem(subMenu.add(title), onClick)
181+ }
182+
183+ private fun setClickListenerToMenuItem (
184+ menuItem : MenuItem ,
185+ onClick : Runnable
186+ ): MenuItem {
187+ menuItem.setOnMenuItemClickListener { _ ->
188+ onClick.run ()
189+ true
190+ }
191+ return menuItem
175192 }
176193
177194 private fun onImportFromServiceSelected (serviceId : Int ) {
@@ -263,13 +280,14 @@ class SubscriptionFragment : BaseStateFragment<SubscriptionState>() {
263280 subscriptionsSection.setPlaceholder(EmptyPlaceholderItem ())
264281 subscriptionsSection.setHideWhenEmpty(true )
265282
266- importExportItem = FeedImportExportItem (
267- { onImportPreviousSelected() },
268- { onImportFromServiceSelected(it) },
269- { onExportSelected() },
270- importExportItemExpandedState ? : false
283+ groupAdapter.add(
284+ Section (
285+ HeaderWithMenuItem (
286+ getString(R .string.tab_subscriptions)
287+ ),
288+ listOf (subscriptionsSection)
289+ )
271290 )
272- groupAdapter.add(Section (importExportItem, listOf (subscriptionsSection)))
273291 }
274292
275293 override fun initViews (rootView : View , savedInstanceState : Bundle ? ) {
@@ -371,13 +389,6 @@ class SubscriptionFragment : BaseStateFragment<SubscriptionState>() {
371389 subscriptionsSection.update(result.subscriptions)
372390 subscriptionsSection.setHideWhenEmpty(false )
373391
374- if (result.subscriptions.isEmpty() && importExportItemExpandedState == null ) {
375- binding.itemsList.post {
376- importExportItem.isExpanded = true
377- importExportItem.notifyChanged(FeedImportExportItem .REFRESH_EXPANDED_STATUS )
378- }
379- }
380-
381392 if (itemsListState != null ) {
382393 binding.itemsList.layoutManager?.onRestoreInstanceState(itemsListState)
383394 itemsListState = null
0 commit comments