From f9a80986705d7bffad2ca6c8ea199d07889f7c56 Mon Sep 17 00:00:00 2001 From: okjack Date: Thu, 22 Feb 2024 15:20:16 +0800 Subject: [PATCH] 1dm --- .../com/fongmi/android/tv/utils/IDMUtil.java | 152 ++++++++++++++++++ .../com/fongmi/android/tv/utils/Util.java | 8 + .../android/tv/ui/activity/VideoActivity.java | 2 + 3 files changed, 162 insertions(+) create mode 100644 app/src/main/java/com/fongmi/android/tv/utils/IDMUtil.java diff --git a/app/src/main/java/com/fongmi/android/tv/utils/IDMUtil.java b/app/src/main/java/com/fongmi/android/tv/utils/IDMUtil.java new file mode 100644 index 000000000..68b16ebd9 --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/utils/IDMUtil.java @@ -0,0 +1,152 @@ +package com.fongmi.android.tv.utils; + +import android.app.Activity; +import android.content.ComponentName; +import android.content.Intent; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.os.Bundle; +import android.text.TextUtils; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.fongmi.android.tv.App; + +import java.util.ArrayList; +import java.util.Map; + +public class IDMUtil { + + public static final String PACKAGE_NAME_1DM_PLUS = "idm.internet.download.manager.plus"; + public static final String PACKAGE_NAME_1DM_NORMAL = "idm.internet.download.manager"; + public static final String PACKAGE_NAME_1DM_LITE = "idm.internet.download.manager.adm.lite"; + public static final String DOWNLOADER_ACTIVITY_NAME_1DM = "idm.internet.download.manager.Downloader"; + public static final int SECURE_URI_1DM_SUPPORT_MIN_VERSION_CODE = 169; + public static final int HEADERS_AND_MULTIPLE_LINKS_1DM_SUPPORT_MIN_VERSION_CODE = 157; + public static final String EXTRA_SECURE_URI = "secure_uri"; + public static final String EXTRA_COOKIES = "extra_cookies"; + public static final String EXTRA_USERAGENT = "extra_useragent"; + public static final String EXTRA_REFERER = "extra_referer"; + public static final String EXTRA_HEADERS = "extra_headers"; + public static final String EXTRA_FILENAME = "extra_filename"; + public static final String EXTRA_URL_LIST = "url_list"; + public static final String EXTRA_URL_FILENAME_LIST = "url_list.filename"; + public static final String MESSAGE_INSTALL_1DM = "To download content install 1DM"; + public static final String MESSAGE_UPDATE_1DM = "To download content update 1DM"; + + public enum AppState {OK, UPDATE_REQUIRED, NOT_INSTALLED} + + public static boolean downloadFile(@NonNull Activity activity, @NonNull String url, boolean secureUri, boolean askUserToInstall1DMIfNotInstalled) { + return downloadFilesInternal(activity, null, url, null, null, null, null, null, secureUri, askUserToInstall1DMIfNotInstalled); + } + + public static boolean downloadFile(@NonNull Activity activity, @NonNull String url, @Nullable Map headers, boolean secureUri, boolean askUserToInstall1DMIfNotInstalled) { + return downloadFilesInternal(activity, null, url, null, null, null, null, headers, secureUri, askUserToInstall1DMIfNotInstalled); + } + + public static boolean downloadFile(@NonNull Activity activity, @NonNull String url, String fileName, @Nullable Map headers, boolean secureUri, boolean askUserToInstall1DMIfNotInstalled) { + return downloadFilesInternal(activity, null, url, null, fileName, null, null, headers, secureUri, askUserToInstall1DMIfNotInstalled); + } + + public static boolean downloadFile(@NonNull Activity activity, @NonNull String url, @Nullable String referer, @Nullable String fileName, @Nullable String userAgent, @Nullable String cookies, boolean secureUri, boolean askUserToInstall1DMIfNotInstalled) { + return downloadFilesInternal(activity, null, url, referer, fileName, userAgent, cookies, null, secureUri, askUserToInstall1DMIfNotInstalled); + } + + public static boolean downloadFile(@NonNull Activity activity, @NonNull String url, @Nullable String referer, @Nullable String fileName, @Nullable String userAgent, @Nullable String cookies, @Nullable Map headers, boolean secureUri, boolean askUserToInstall1DMIfNotInstalled) { + return downloadFilesInternal(activity, null, url, referer, fileName, userAgent, cookies, headers, secureUri, askUserToInstall1DMIfNotInstalled); + } + + public static boolean downloadFiles(@NonNull Activity activity, @NonNull Map urlAndFileNames, boolean secureUri, boolean askUserToInstall1DMIfNotInstalled) { + return downloadFilesInternal(activity, urlAndFileNames, null, null, null, null, null, null, secureUri, askUserToInstall1DMIfNotInstalled); + } + + public static boolean downloadFiles(@NonNull Activity activity, @NonNull Map urlAndFileNames, @Nullable Map headers, boolean secureUri, boolean askUserToInstall1DMIfNotInstalled) { + return downloadFilesInternal(activity, urlAndFileNames, null, null, null, null, null, headers, secureUri, askUserToInstall1DMIfNotInstalled); + } + + private static boolean downloadFilesInternal(@NonNull Activity activity, @Nullable Map urlAndFileNames, @Nullable String url, @Nullable String referer, @Nullable String fileName, @Nullable String userAgent, @Nullable String cookies, @Nullable Map headers, boolean secureUri, boolean askUserToInstall1DMIfNotInstalled){ + int requiredVersionCode = secureUri ? SECURE_URI_1DM_SUPPORT_MIN_VERSION_CODE : !isEmpty(urlAndFileNames) || !isEmpty(headers) ? HEADERS_AND_MULTIPLE_LINKS_1DM_SUPPORT_MIN_VERSION_CODE : 0; + String packageName = ""; + try { + packageName = get1DMInstalledPackageName(requiredVersionCode, askUserToInstall1DMIfNotInstalled); + } catch (Exception e) { + return false; + } + if (TextUtils.isEmpty(packageName)) return false; + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setComponent(new ComponentName(packageName, DOWNLOADER_ACTIVITY_NAME_1DM)); + intent.putExtra(EXTRA_SECURE_URI, secureUri); + if (isEmpty(urlAndFileNames)) { + intent.setData(Uri.parse(url)); + if (!TextUtils.isEmpty(referer)) intent.putExtra(EXTRA_REFERER, referer); + if (!TextUtils.isEmpty(userAgent)) intent.putExtra(EXTRA_USERAGENT, userAgent); + if (!TextUtils.isEmpty(cookies)) intent.putExtra(EXTRA_COOKIES, cookies); + if (!TextUtils.isEmpty(fileName)) intent.putExtra(EXTRA_FILENAME, fileName); + } else { + ArrayList urls = new ArrayList<>(urlAndFileNames.size()); + ArrayList names = new ArrayList<>(urlAndFileNames.size()); + for (Map.Entry entry : urlAndFileNames.entrySet()) { + if (TextUtils.isEmpty(entry.getKey())) continue; + urls.add(entry.getKey()); + names.add(entry.getValue()); + } + if (urls.size() > 0) { + intent.putExtra(EXTRA_URL_LIST, urls); + intent.putExtra(EXTRA_URL_FILENAME_LIST, names); + intent.setData(Uri.parse(urls.get(0))); + } + } + if (!isEmpty(headers)) { + Bundle extra = new Bundle(); + for (Map.Entry entry : headers.entrySet()) extra.putString(entry.getKey(), entry.getValue()); + intent.putExtra(EXTRA_HEADERS, extra); + } + activity.startActivity(intent); + return true; + } + + public static void install1DM(String packageName, boolean update) { + + } + + private static boolean isEmpty(Map map) { + return map == null || map.size() == 0; + } + + private static String get1DMInstalledPackageName(int requiredVersionCode, boolean askUserToInstall1DMIfNotInstalled) throws Exception { + PackageManager packageManager = App.get().getPackageManager(); + String packageName = PACKAGE_NAME_1DM_PLUS; + AppState state = get1DMAppState(packageManager, packageName, requiredVersionCode); + if (state == AppState.NOT_INSTALLED) { + packageName = PACKAGE_NAME_1DM_NORMAL; + state = get1DMAppState(packageManager, packageName, requiredVersionCode); + if (state == AppState.NOT_INSTALLED) { + packageName = PACKAGE_NAME_1DM_LITE; + state = get1DMAppState(packageManager, packageName, requiredVersionCode); + if (state == AppState.NOT_INSTALLED) { + if (!askUserToInstall1DMIfNotInstalled) throw new Exception(MESSAGE_INSTALL_1DM); + install1DM(PACKAGE_NAME_1DM_NORMAL, false); + return null; + } + } + } + if (state == AppState.UPDATE_REQUIRED) { + if (!askUserToInstall1DMIfNotInstalled) throw new Exception(MESSAGE_UPDATE_1DM); + install1DM(packageName, true); + return null; + } + return packageName; + } + + private static AppState get1DMAppState(@NonNull PackageManager packageManager, @NonNull String packageName, int requiredVersion) { + try { + PackageInfo packageInfo = packageManager.getPackageInfo(packageName, 0); + if (requiredVersion <= 0 || packageInfo.versionCode >= requiredVersion) return AppState.OK; + return AppState.UPDATE_REQUIRED; + } catch (PackageManager.NameNotFoundException ignore) { + return AppState.NOT_INSTALLED; + } + } +} diff --git a/app/src/main/java/com/fongmi/android/tv/utils/Util.java b/app/src/main/java/com/fongmi/android/tv/utils/Util.java index a1e612674..ca44b3de0 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/Util.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/Util.java @@ -10,6 +10,7 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.res.Configuration; +import android.net.Uri; import android.os.Build; import android.os.IBinder; import android.os.Parcelable; @@ -172,4 +173,11 @@ public class Util { } return false; } + + public static String getDownloadUrl(String url) { + if (url == null) return ""; + if (!url.startsWith("http://127.0.0.1:7777")) return url; + return Uri.parse(url).getQueryParameter("url"); + } + } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index 553a62f41..363c60476 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -89,6 +89,7 @@ import com.fongmi.android.tv.ui.dialog.InfoDialog; import com.fongmi.android.tv.ui.dialog.TrackDialog; import com.fongmi.android.tv.utils.Clock; import com.fongmi.android.tv.utils.FileChooser; +import com.fongmi.android.tv.utils.IDMUtil; import com.fongmi.android.tv.utils.ImgUtil; import com.fongmi.android.tv.utils.Notify; import com.fongmi.android.tv.utils.PiP; @@ -1662,6 +1663,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo @Override public void onShare(CharSequence title, String url) { + if (IDMUtil.downloadFile(this, Util.getDownloadUrl(url), title.toString(), mPlayers.getHeaders(), false, false)) return; Intent intent = new Intent(Intent.ACTION_SEND); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra(Intent.EXTRA_TEXT, url);