From c45a6ae34688ebd0074976e67bef970b96e8d877 Mon Sep 17 00:00:00 2001 From: sictiru Date: Thu, 31 Mar 2022 21:23:52 -0700 Subject: [PATCH] #1627 Import export opml WIP --- clients/android/NewsBlur/AndroidManifest.xml | 1 + .../res/drawable/ic_cloud_download.xml | 10 +++ .../NewsBlur/res/drawable/ic_cloud_upload.xml | 10 +++ .../res/layout/activity_import_export.xml | 43 ++++++++++ clients/android/NewsBlur/res/menu/main.xml | 4 + .../android/NewsBlur/res/values/strings.xml | 5 +- .../newsblur/activity/ImportExportActivity.kt | 82 +++++++++++++++++++ .../src/com/newsblur/activity/Main.java | 4 + .../com/newsblur/network/APIConstants.java | 2 + .../src/com/newsblur/network/APIManager.java | 7 ++ .../viewModel/ImportExportViewModel.kt | 15 ++++ 11 files changed, 182 insertions(+), 1 deletion(-) create mode 100644 clients/android/NewsBlur/res/drawable/ic_cloud_download.xml create mode 100644 clients/android/NewsBlur/res/drawable/ic_cloud_upload.xml create mode 100644 clients/android/NewsBlur/res/layout/activity_import_export.xml create mode 100644 clients/android/NewsBlur/src/com/newsblur/activity/ImportExportActivity.kt create mode 100644 clients/android/NewsBlur/src/com/newsblur/viewModel/ImportExportViewModel.kt diff --git a/clients/android/NewsBlur/AndroidManifest.xml b/clients/android/NewsBlur/AndroidManifest.xml index 8d79010dc..81cc108a7 100644 --- a/clients/android/NewsBlur/AndroidManifest.xml +++ b/clients/android/NewsBlur/AndroidManifest.xml @@ -70,6 +70,7 @@ android:name=".activity.Settings" android:label="@string/settings"/> + + + diff --git a/clients/android/NewsBlur/res/drawable/ic_cloud_upload.xml b/clients/android/NewsBlur/res/drawable/ic_cloud_upload.xml new file mode 100644 index 000000000..0d7b36c43 --- /dev/null +++ b/clients/android/NewsBlur/res/drawable/ic_cloud_upload.xml @@ -0,0 +1,10 @@ + + + diff --git a/clients/android/NewsBlur/res/layout/activity_import_export.xml b/clients/android/NewsBlur/res/layout/activity_import_export.xml new file mode 100644 index 000000000..9968de7d4 --- /dev/null +++ b/clients/android/NewsBlur/res/layout/activity_import_export.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/clients/android/NewsBlur/res/menu/main.xml b/clients/android/NewsBlur/res/menu/main.xml index 3d4efe7bf..ac6d88cf3 100644 --- a/clients/android/NewsBlur/res/menu/main.xml +++ b/clients/android/NewsBlur/res/menu/main.xml @@ -18,6 +18,10 @@ android:title="@string/menu_premium_account" app:showAsAction="never" /> + + diff --git a/clients/android/NewsBlur/res/values/strings.xml b/clients/android/NewsBlur/res/values/strings.xml index a44b94352..9f141421f 100644 --- a/clients/android/NewsBlur/res/values/strings.xml +++ b/clients/android/NewsBlur/res/values/strings.xml @@ -268,13 +268,16 @@ %s subscribers %d opens %d stories/month - + + Import/Export… Preferences… Mute Sites… Widget… Tap to setup in NewsBlur No active subscriptions detected Loading… + + Import/Export OPML Reading by folder is only available to Search is only available to diff --git a/clients/android/NewsBlur/src/com/newsblur/activity/ImportExportActivity.kt b/clients/android/NewsBlur/src/com/newsblur/activity/ImportExportActivity.kt new file mode 100644 index 000000000..ef0a93e2c --- /dev/null +++ b/clients/android/NewsBlur/src/com/newsblur/activity/ImportExportActivity.kt @@ -0,0 +1,82 @@ +package com.newsblur.activity + +import android.app.Activity +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.webkit.MimeTypeMap +import com.newsblur.R +import com.newsblur.databinding.ActivityImportExportBinding +import com.newsblur.network.APIConstants +import com.newsblur.util.UIUtils +import java.io.BufferedReader +import java.io.IOException +import java.io.InputStreamReader + +class ImportExportActivity : NbActivity() { + + private val pickXmlFileRequestCode = 10 + + private lateinit var binding: ActivityImportExportBinding + + override fun onCreate(bundle: Bundle?) { + super.onCreate(bundle) + binding = ActivityImportExportBinding.inflate(layoutInflater) + setContentView(binding.root) + + setupUI() + setupListeners() + } + + private fun setupUI() { + UIUtils.setupToolbar(this, R.drawable.logo, getString(R.string.import_export_title), true) + } + + private fun setupListeners() { + binding.btnUpload.setOnClickListener { pickOpmlFile() } + binding.btnDownload.setOnClickListener { exportOpmlFile() } + } + + private fun pickOpmlFile() { + val mineType = MimeTypeMap.getSingleton().getMimeTypeFromExtension("xml") + Intent(Intent.ACTION_OPEN_DOCUMENT).apply { + addCategory(Intent.CATEGORY_OPENABLE) + type = mineType + }.also { + startActivityForResult(it, pickXmlFileRequestCode) + } + } + + private fun exportOpmlFile() { + val exportOpmlUrl = APIConstants.buildUrl(APIConstants.PATH_EXPORT_OPML) + UIUtils.handleUri(this, Uri.parse(exportOpmlUrl)) + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { + super.onActivityResult(requestCode, resultCode, resultData) + if (requestCode == pickXmlFileRequestCode && resultCode == Activity.RESULT_OK) { + // The result data contains a URI for the document or directory that + // the user selected. + resultData?.data?.also { uri -> + // Perform operations on the document using its URI. + readTextFromUri(uri) + } + } + } + + @Throws(IOException::class) + private fun readTextFromUri(uri: Uri): String { + val stringBuilder = StringBuilder() + contentResolver.openInputStream(uri)?.use { inputStream -> + BufferedReader(InputStreamReader(inputStream)).use { reader -> + var line: String? = reader.readLine() + while (line != null) { + stringBuilder.append(line) + line = reader.readLine() + } + } + } + return stringBuilder.toString() + } + +} \ No newline at end of file diff --git a/clients/android/NewsBlur/src/com/newsblur/activity/Main.java b/clients/android/NewsBlur/src/com/newsblur/activity/Main.java index 1f8e431fd..ff120fbe3 100644 --- a/clients/android/NewsBlur/src/com/newsblur/activity/Main.java +++ b/clients/android/NewsBlur/src/com/newsblur/activity/Main.java @@ -347,6 +347,10 @@ public class Main extends NbActivity implements StateChangedListener, SwipeRefre Intent intent = new Intent(this, MuteConfig.class); startActivity(intent); return true; + } else if (item.getItemId() == R.id.menu_import_export) { + Intent intent = new Intent(this, ImportExportActivity.class); + startActivity(intent); + return true; } return false; } diff --git a/clients/android/NewsBlur/src/com/newsblur/network/APIConstants.java b/clients/android/NewsBlur/src/com/newsblur/network/APIConstants.java index d1ab0c6f6..b11599ac9 100644 --- a/clients/android/NewsBlur/src/com/newsblur/network/APIConstants.java +++ b/clients/android/NewsBlur/src/com/newsblur/network/APIConstants.java @@ -85,6 +85,7 @@ public class APIConstants { public static final String PATH_SAVE_RECEIPT = "/profile/save_android_receipt"; public static final String PATH_FEED_STATISTICS = "/rss_feeds/statistics_embedded/"; public static final String PATH_FEED_FAVICON_URL = "/rss_feeds/icon/"; + public static final String PATH_EXPORT_OPML = "/import/opml_export"; public static String buildUrl(String path) { return CurrentUrlBase + path; @@ -116,6 +117,7 @@ public class APIConstants { public static final String PARAMETER_MARKSOCIAL_JSON = "users_feeds_stories"; public static final String PARAMETER_URL = "url"; public static final String PARAMETER_DAYS = "days"; + public static final String PARAMETER_DATA = "data"; public static final String PARAMETER_UPDATE_COUNTS = "update_counts"; public static final String PARAMETER_CUTOFF_TIME = "cutoff_timestamp"; public static final String PARAMETER_DIRECTION = "direction"; diff --git a/clients/android/NewsBlur/src/com/newsblur/network/APIManager.java b/clients/android/NewsBlur/src/com/newsblur/network/APIManager.java index e0b0ac3d0..49c2cb3e9 100644 --- a/clients/android/NewsBlur/src/com/newsblur/network/APIManager.java +++ b/clients/android/NewsBlur/src/com/newsblur/network/APIManager.java @@ -196,6 +196,13 @@ public class APIManager { return response.getResponse(gson, NewsBlurResponse.class); } + public NewsBlurResponse importOpmlData(String data) { + final ValueMultimap values = new ValueMultimap(); + values.put(APIConstants.PARAMETER_DATA, data); + APIResponse response = post(buildUrl(APIConstants.PATH_EXPORT_OPML), values); + return response.getResponse(gson, NewsBlurResponse.class); + } + public RegisterResponse signup(final String username, final String password, final String email) { final ContentValues values = new ContentValues(); values.put(APIConstants.PARAMETER_USERNAME, username); diff --git a/clients/android/NewsBlur/src/com/newsblur/viewModel/ImportExportViewModel.kt b/clients/android/NewsBlur/src/com/newsblur/viewModel/ImportExportViewModel.kt new file mode 100644 index 000000000..395639a1a --- /dev/null +++ b/clients/android/NewsBlur/src/com/newsblur/viewModel/ImportExportViewModel.kt @@ -0,0 +1,15 @@ +package com.newsblur.viewModel + +import androidx.lifecycle.ViewModel +import com.newsblur.network.APIManager +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject + +@HiltViewModel +class ImportExportViewModel +@Inject constructor(apiManager: APIManager) : ViewModel() { + + fun import() { + + } +} \ No newline at end of file