mirror of
				https://github.com/TeamNewPipe/NewPipe
				synced 2025-10-31 07:13:00 +00:00 
			
		
		
		
	Store/retrieve parcelable arrays as lists instead.
This commit is contained in:
		 Isira Seneviratne
					Isira Seneviratne
				
			
				
					committed by
					
						 Stypox
						Stypox
					
				
			
			
				
	
			
			
			 Stypox
						Stypox
					
				
			
						parent
						
							76f1e588f7
						
					
				
				
					commit
					f9fc1cd817
				
			| @@ -25,6 +25,7 @@ import android.view.ViewGroup; | |||||||
| import androidx.annotation.IntDef; | import androidx.annotation.IntDef; | ||||||
| import androidx.annotation.NonNull; | import androidx.annotation.NonNull; | ||||||
| import androidx.annotation.Nullable; | import androidx.annotation.Nullable; | ||||||
|  | import androidx.core.os.BundleCompat; | ||||||
| import androidx.lifecycle.Lifecycle; | import androidx.lifecycle.Lifecycle; | ||||||
| import androidx.viewpager.widget.PagerAdapter; | import androidx.viewpager.widget.PagerAdapter; | ||||||
|  |  | ||||||
| @@ -284,7 +285,7 @@ public abstract class FragmentStatePagerAdapterMenuWorkaround extends PagerAdapt | |||||||
|         Bundle state = null; |         Bundle state = null; | ||||||
|         if (!mSavedState.isEmpty()) { |         if (!mSavedState.isEmpty()) { | ||||||
|             state = new Bundle(); |             state = new Bundle(); | ||||||
|             state.putParcelableArray("states", mSavedState.toArray(new Fragment.SavedState[0])); |             state.putParcelableArrayList("states", mSavedState); | ||||||
|         } |         } | ||||||
|         for (int i = 0; i < mFragments.size(); i++) { |         for (int i = 0; i < mFragments.size(); i++) { | ||||||
|             final Fragment f = mFragments.get(i); |             final Fragment f = mFragments.get(i); | ||||||
| @@ -311,13 +312,12 @@ public abstract class FragmentStatePagerAdapterMenuWorkaround extends PagerAdapt | |||||||
|         if (state != null) { |         if (state != null) { | ||||||
|             final Bundle bundle = (Bundle) state; |             final Bundle bundle = (Bundle) state; | ||||||
|             bundle.setClassLoader(loader); |             bundle.setClassLoader(loader); | ||||||
|             final Parcelable[] fss = bundle.getParcelableArray("states"); |             final var states = BundleCompat.getParcelableArrayList(bundle, "states", | ||||||
|  |                     Fragment.SavedState.class); | ||||||
|             mSavedState.clear(); |             mSavedState.clear(); | ||||||
|             mFragments.clear(); |             mFragments.clear(); | ||||||
|             if (fss != null) { |             if (states != null) { | ||||||
|                 for (final Parcelable parcelable : fss) { |                 mSavedState.addAll(states); | ||||||
|                     mSavedState.add((Fragment.SavedState) parcelable); |  | ||||||
|                 } |  | ||||||
|             } |             } | ||||||
|             final Iterable<String> keys = bundle.keySet(); |             final Iterable<String> keys = bundle.keySet(); | ||||||
|             for (final String key : keys) { |             for (final String key : keys) { | ||||||
|   | |||||||
| @@ -116,7 +116,7 @@ class AboutActivity : AppCompatActivity() { | |||||||
|         /** |         /** | ||||||
|          * List of all software components. |          * List of all software components. | ||||||
|          */ |          */ | ||||||
|         private val SOFTWARE_COMPONENTS = arrayOf( |         private val SOFTWARE_COMPONENTS = arrayListOf( | ||||||
|             SoftwareComponent( |             SoftwareComponent( | ||||||
|                 "ACRA", "2013", "Kevin Gaudin", |                 "ACRA", "2013", "Kevin Gaudin", | ||||||
|                 "https://github.com/ACRA/acra", StandardLicenses.APACHE2 |                 "https://github.com/ACRA/acra", StandardLicenses.APACHE2 | ||||||
|   | |||||||
| @@ -18,6 +18,7 @@ import org.schabi.newpipe.BuildConfig | |||||||
| import org.schabi.newpipe.R | import org.schabi.newpipe.R | ||||||
| import org.schabi.newpipe.databinding.FragmentLicensesBinding | import org.schabi.newpipe.databinding.FragmentLicensesBinding | ||||||
| import org.schabi.newpipe.databinding.ItemSoftwareComponentBinding | import org.schabi.newpipe.databinding.ItemSoftwareComponentBinding | ||||||
|  | import org.schabi.newpipe.ktx.parcelableArrayList | ||||||
| import org.schabi.newpipe.util.Localization | import org.schabi.newpipe.util.Localization | ||||||
| import org.schabi.newpipe.util.external_communication.ShareUtils | import org.schabi.newpipe.util.external_communication.ShareUtils | ||||||
|  |  | ||||||
| @@ -25,16 +26,15 @@ import org.schabi.newpipe.util.external_communication.ShareUtils | |||||||
|  * Fragment containing the software licenses. |  * Fragment containing the software licenses. | ||||||
|  */ |  */ | ||||||
| class LicenseFragment : Fragment() { | class LicenseFragment : Fragment() { | ||||||
|     private lateinit var softwareComponents: Array<SoftwareComponent> |     private lateinit var softwareComponents: List<SoftwareComponent> | ||||||
|     private var activeSoftwareComponent: SoftwareComponent? = null |     private var activeSoftwareComponent: SoftwareComponent? = null | ||||||
|     private val compositeDisposable = CompositeDisposable() |     private val compositeDisposable = CompositeDisposable() | ||||||
|  |  | ||||||
|     override fun onCreate(savedInstanceState: Bundle?) { |     override fun onCreate(savedInstanceState: Bundle?) { | ||||||
|         super.onCreate(savedInstanceState) |         super.onCreate(savedInstanceState) | ||||||
|         softwareComponents = arguments?.getParcelableArray(ARG_COMPONENTS) as Array<SoftwareComponent> |         softwareComponents = arguments?.parcelableArrayList<SoftwareComponent>(ARG_COMPONENTS)!! | ||||||
|  |             .sortedBy { it.name } // Sort components by name | ||||||
|         activeSoftwareComponent = savedInstanceState?.getSerializable(SOFTWARE_COMPONENT_KEY) as? SoftwareComponent |         activeSoftwareComponent = savedInstanceState?.getSerializable(SOFTWARE_COMPONENT_KEY) as? SoftwareComponent | ||||||
|         // Sort components by name |  | ||||||
|         softwareComponents.sortBy { it.name } |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     override fun onDestroy() { |     override fun onDestroy() { | ||||||
| @@ -130,7 +130,8 @@ class LicenseFragment : Fragment() { | |||||||
|             StandardLicenses.GPL3, |             StandardLicenses.GPL3, | ||||||
|             BuildConfig.VERSION_NAME |             BuildConfig.VERSION_NAME | ||||||
|         ) |         ) | ||||||
|         fun newInstance(softwareComponents: Array<SoftwareComponent>): LicenseFragment { |  | ||||||
|  |         fun newInstance(softwareComponents: ArrayList<SoftwareComponent>): LicenseFragment { | ||||||
|             val fragment = LicenseFragment() |             val fragment = LicenseFragment() | ||||||
|             fragment.arguments = bundleOf(ARG_COMPONENTS to softwareComponents) |             fragment.arguments = bundleOf(ARG_COMPONENTS to softwareComponents) | ||||||
|             return fragment |             return fragment | ||||||
|   | |||||||
| @@ -74,6 +74,7 @@ import org.schabi.newpipe.util.ThemeHelper; | |||||||
|  |  | ||||||
| import java.io.File; | import java.io.File; | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
|  | import java.util.ArrayList; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.Locale; | import java.util.Locale; | ||||||
| import java.util.Objects; | import java.util.Objects; | ||||||
| @@ -1052,7 +1053,7 @@ public class DownloadDialog extends DialogFragment | |||||||
|         final char kind; |         final char kind; | ||||||
|         int threads = dialogBinding.threads.getProgress() + 1; |         int threads = dialogBinding.threads.getProgress() + 1; | ||||||
|         final String[] urls; |         final String[] urls; | ||||||
|         final MissionRecoveryInfo[] recoveryInfo; |         final List<MissionRecoveryInfo> recoveryInfo; | ||||||
|         String psName = null; |         String psName = null; | ||||||
|         String[] psArgs = null; |         String[] psArgs = null; | ||||||
|         long nearLength = 0; |         long nearLength = 0; | ||||||
| @@ -1117,9 +1118,7 @@ public class DownloadDialog extends DialogFragment | |||||||
|             urls = new String[] { |             urls = new String[] { | ||||||
|                     selectedStream.getContent() |                     selectedStream.getContent() | ||||||
|             }; |             }; | ||||||
|             recoveryInfo = new MissionRecoveryInfo[] { |             recoveryInfo = List.of(new MissionRecoveryInfo(selectedStream)); | ||||||
|                     new MissionRecoveryInfo(selectedStream) |  | ||||||
|             }; |  | ||||||
|         } else { |         } else { | ||||||
|             if (secondaryStream.getDeliveryMethod() != PROGRESSIVE_HTTP) { |             if (secondaryStream.getDeliveryMethod() != PROGRESSIVE_HTTP) { | ||||||
|                 throw new IllegalArgumentException("Unsupported stream delivery format" |                 throw new IllegalArgumentException("Unsupported stream delivery format" | ||||||
| @@ -1129,12 +1128,14 @@ public class DownloadDialog extends DialogFragment | |||||||
|             urls = new String[] { |             urls = new String[] { | ||||||
|                     selectedStream.getContent(), secondaryStream.getContent() |                     selectedStream.getContent(), secondaryStream.getContent() | ||||||
|             }; |             }; | ||||||
|             recoveryInfo = new MissionRecoveryInfo[] {new MissionRecoveryInfo(selectedStream), |             recoveryInfo = List.of( | ||||||
|                     new MissionRecoveryInfo(secondaryStream)}; |                     new MissionRecoveryInfo(selectedStream), | ||||||
|  |                     new MissionRecoveryInfo(secondaryStream) | ||||||
|  |             ); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         DownloadManagerService.startMission(context, urls, storage, kind, threads, |         DownloadManagerService.startMission(context, urls, storage, kind, threads, | ||||||
|                 currentInfo.getUrl(), psName, psArgs, nearLength, recoveryInfo); |                 currentInfo.getUrl(), psName, psArgs, nearLength, new ArrayList<>(recoveryInfo)); | ||||||
|  |  | ||||||
|         Toast.makeText(context, getString(R.string.download_has_started), |         Toast.makeText(context, getString(R.string.download_has_started), | ||||||
|                 Toast.LENGTH_SHORT).show(); |                 Toast.LENGTH_SHORT).show(); | ||||||
|   | |||||||
							
								
								
									
										9
									
								
								app/src/main/java/org/schabi/newpipe/ktx/Bundle.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								app/src/main/java/org/schabi/newpipe/ktx/Bundle.kt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | |||||||
|  | package org.schabi.newpipe.ktx | ||||||
|  |  | ||||||
|  | import android.os.Bundle | ||||||
|  | import android.os.Parcelable | ||||||
|  | import androidx.core.os.BundleCompat | ||||||
|  |  | ||||||
|  | inline fun <reified T : Parcelable> Bundle.parcelableArrayList(key: String?): ArrayList<T>? { | ||||||
|  |     return BundleCompat.getParcelableArrayList(this, key, T::class.java) | ||||||
|  | } | ||||||
| @@ -23,7 +23,6 @@ import android.os.Handler; | |||||||
| import android.os.Handler.Callback; | import android.os.Handler.Callback; | ||||||
| import android.os.IBinder; | import android.os.IBinder; | ||||||
| import android.os.Message; | import android.os.Message; | ||||||
| import android.os.Parcelable; |  | ||||||
| import android.util.Log; | import android.util.Log; | ||||||
| import android.widget.Toast; | import android.widget.Toast; | ||||||
|  |  | ||||||
| @@ -36,6 +35,7 @@ import androidx.core.app.NotificationCompat.Builder; | |||||||
| import androidx.core.app.PendingIntentCompat; | import androidx.core.app.PendingIntentCompat; | ||||||
| import androidx.core.app.ServiceCompat; | import androidx.core.app.ServiceCompat; | ||||||
| import androidx.core.content.ContextCompat; | import androidx.core.content.ContextCompat; | ||||||
|  | import androidx.core.content.IntentCompat; | ||||||
| import androidx.preference.PreferenceManager; | import androidx.preference.PreferenceManager; | ||||||
|  |  | ||||||
| import org.schabi.newpipe.R; | import org.schabi.newpipe.R; | ||||||
| @@ -49,6 +49,7 @@ import java.io.File; | |||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
| import java.util.List; | import java.util.List; | ||||||
|  | import java.util.Objects; | ||||||
|  |  | ||||||
| import us.shandian.giga.get.DownloadMission; | import us.shandian.giga.get.DownloadMission; | ||||||
| import us.shandian.giga.get.MissionRecoveryInfo; | import us.shandian.giga.get.MissionRecoveryInfo; | ||||||
| @@ -359,29 +360,29 @@ public class DownloadManagerService extends Service { | |||||||
|      */ |      */ | ||||||
|     public static void startMission(Context context, String[] urls, StoredFileHelper storage, |     public static void startMission(Context context, String[] urls, StoredFileHelper storage, | ||||||
|                                     char kind, int threads, String source, String psName, |                                     char kind, int threads, String source, String psName, | ||||||
|                                     String[] psArgs, long nearLength, MissionRecoveryInfo[] recoveryInfo) { |                                     String[] psArgs, long nearLength, | ||||||
|         Intent intent = new Intent(context, DownloadManagerService.class); |                                     ArrayList<MissionRecoveryInfo> recoveryInfo) { | ||||||
|         intent.setAction(Intent.ACTION_RUN); |         final Intent intent = new Intent(context, DownloadManagerService.class) | ||||||
|         intent.putExtra(EXTRA_URLS, urls); |                 .setAction(Intent.ACTION_RUN) | ||||||
|         intent.putExtra(EXTRA_KIND, kind); |                 .putExtra(EXTRA_URLS, urls) | ||||||
|         intent.putExtra(EXTRA_THREADS, threads); |                 .putExtra(EXTRA_KIND, kind) | ||||||
|         intent.putExtra(EXTRA_SOURCE, source); |                 .putExtra(EXTRA_THREADS, threads) | ||||||
|         intent.putExtra(EXTRA_POSTPROCESSING_NAME, psName); |                 .putExtra(EXTRA_SOURCE, source) | ||||||
|         intent.putExtra(EXTRA_POSTPROCESSING_ARGS, psArgs); |                 .putExtra(EXTRA_POSTPROCESSING_NAME, psName) | ||||||
|         intent.putExtra(EXTRA_NEAR_LENGTH, nearLength); |                 .putExtra(EXTRA_POSTPROCESSING_ARGS, psArgs) | ||||||
|         intent.putExtra(EXTRA_RECOVERY_INFO, recoveryInfo); |                 .putExtra(EXTRA_NEAR_LENGTH, nearLength) | ||||||
|  |                 .putExtra(EXTRA_RECOVERY_INFO, recoveryInfo) | ||||||
|         intent.putExtra(EXTRA_PARENT_PATH, storage.getParentUri()); |                 .putExtra(EXTRA_PARENT_PATH, storage.getParentUri()) | ||||||
|         intent.putExtra(EXTRA_PATH, storage.getUri()); |                 .putExtra(EXTRA_PATH, storage.getUri()) | ||||||
|         intent.putExtra(EXTRA_STORAGE_TAG, storage.getTag()); |                 .putExtra(EXTRA_STORAGE_TAG, storage.getTag()); | ||||||
|  |  | ||||||
|         context.startService(intent); |         context.startService(intent); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private void startMission(Intent intent) { |     private void startMission(Intent intent) { | ||||||
|         String[] urls = intent.getStringArrayExtra(EXTRA_URLS); |         String[] urls = intent.getStringArrayExtra(EXTRA_URLS); | ||||||
|         Uri path = intent.getParcelableExtra(EXTRA_PATH); |         Uri path = IntentCompat.getParcelableExtra(intent, EXTRA_PATH, Uri.class); | ||||||
|         Uri parentPath = intent.getParcelableExtra(EXTRA_PARENT_PATH); |         Uri parentPath = IntentCompat.getParcelableExtra(intent, EXTRA_PARENT_PATH, Uri.class); | ||||||
|         int threads = intent.getIntExtra(EXTRA_THREADS, 1); |         int threads = intent.getIntExtra(EXTRA_THREADS, 1); | ||||||
|         char kind = intent.getCharExtra(EXTRA_KIND, '?'); |         char kind = intent.getCharExtra(EXTRA_KIND, '?'); | ||||||
|         String psName = intent.getStringExtra(EXTRA_POSTPROCESSING_NAME); |         String psName = intent.getStringExtra(EXTRA_POSTPROCESSING_NAME); | ||||||
| @@ -389,7 +390,9 @@ public class DownloadManagerService extends Service { | |||||||
|         String source = intent.getStringExtra(EXTRA_SOURCE); |         String source = intent.getStringExtra(EXTRA_SOURCE); | ||||||
|         long nearLength = intent.getLongExtra(EXTRA_NEAR_LENGTH, 0); |         long nearLength = intent.getLongExtra(EXTRA_NEAR_LENGTH, 0); | ||||||
|         String tag = intent.getStringExtra(EXTRA_STORAGE_TAG); |         String tag = intent.getStringExtra(EXTRA_STORAGE_TAG); | ||||||
|         Parcelable[] parcelRecovery = intent.getParcelableArrayExtra(EXTRA_RECOVERY_INFO); |         final var recovery = IntentCompat.getParcelableArrayListExtra(intent, EXTRA_RECOVERY_INFO, | ||||||
|  |                 MissionRecoveryInfo.class); | ||||||
|  |         Objects.requireNonNull(recovery); | ||||||
|  |  | ||||||
|         StoredFileHelper storage; |         StoredFileHelper storage; | ||||||
|         try { |         try { | ||||||
| @@ -404,15 +407,11 @@ public class DownloadManagerService extends Service { | |||||||
|         else |         else | ||||||
|             ps = Postprocessing.getAlgorithm(psName, psArgs); |             ps = Postprocessing.getAlgorithm(psName, psArgs); | ||||||
|  |  | ||||||
|         MissionRecoveryInfo[] recovery = new MissionRecoveryInfo[parcelRecovery.length]; |  | ||||||
|         for (int i = 0; i < parcelRecovery.length; i++) |  | ||||||
|             recovery[i] = (MissionRecoveryInfo) parcelRecovery[i]; |  | ||||||
|  |  | ||||||
|         final DownloadMission mission = new DownloadMission(urls, storage, kind, ps); |         final DownloadMission mission = new DownloadMission(urls, storage, kind, ps); | ||||||
|         mission.threadCount = threads; |         mission.threadCount = threads; | ||||||
|         mission.source = source; |         mission.source = source; | ||||||
|         mission.nearLength = nearLength; |         mission.nearLength = nearLength; | ||||||
|         mission.recoveryInfo = recovery; |         mission.recoveryInfo = recovery.toArray(MissionRecoveryInfo[]::new); | ||||||
|  |  | ||||||
|         if (ps != null) |         if (ps != null) | ||||||
|             ps.setTemporalDir(DownloadManager.pickAvailableTemporalDir(this)); |             ps.setTemporalDir(DownloadManager.pickAvailableTemporalDir(this)); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user