From 604fd300c8c2c30323787500a0cb6d85035feb0e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Denis=20=C3=87erri?=
<64997243+deniscerri@users.noreply.github.com>
Date: Tue, 3 Jan 2023 23:31:32 +0100
Subject: [PATCH] kotlin-migration init
---
.idea/.name | 1 +
.idea/compiler.xml | 2 +-
.idea/misc.xml | 2 +-
app/build.gradle | 50 ++-
.../7.json | 192 +++++++++
.../main/java/com/deniscerri/ytdlnis/App.java | 2 -
.../com/deniscerri/ytdlnis/MainActivity.java | 359 -----------------
.../com/deniscerri/ytdlnis/MainActivity.kt | 363 ++++++++++++++++++
.../deniscerri/ytdlnis/database/DBManager.kt | 43 +++
.../{DBManager.java => DatabaseManager.java} | 7 +-
.../ytdlnis/database/dao/HistoryDao.kt | 90 +++++
.../ytdlnis/database/dao/ResultDao.kt | 21 +
.../ytdlnis/database/models/HistoryItem.kt | 20 +
.../ytdlnis/database/models/ResultItem.kt | 23 ++
.../ytdlnis/page/DownloadsFragment.java | 76 ++--
.../deniscerri/ytdlnis/page/HomeFragment.java | 67 ++--
.../ytdlnis/util/DownloadWorker.java | 36 ++
.../com/deniscerri/ytdlnis/util/FileUtil.kt | 18 +
.../com/deniscerri/ytdlnis/util/InfoUtil.java | 22 +-
build.gradle | 71 ++--
gradle/wrapper/gradle-wrapper.properties | 4 +-
settings.gradle | 19 +
22 files changed, 981 insertions(+), 507 deletions(-)
create mode 100644 .idea/.name
create mode 100644 app/schemas/com.deniscerri.ytdlnis.database.DBManager/7.json
delete mode 100644 app/src/main/java/com/deniscerri/ytdlnis/MainActivity.java
create mode 100644 app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt
create mode 100644 app/src/main/java/com/deniscerri/ytdlnis/database/DBManager.kt
rename app/src/main/java/com/deniscerri/ytdlnis/database/{DBManager.java => DatabaseManager.java} (98%)
create mode 100644 app/src/main/java/com/deniscerri/ytdlnis/database/dao/HistoryDao.kt
create mode 100644 app/src/main/java/com/deniscerri/ytdlnis/database/dao/ResultDao.kt
create mode 100644 app/src/main/java/com/deniscerri/ytdlnis/database/models/HistoryItem.kt
create mode 100644 app/src/main/java/com/deniscerri/ytdlnis/database/models/ResultItem.kt
create mode 100644 app/src/main/java/com/deniscerri/ytdlnis/util/DownloadWorker.java
create mode 100644 app/src/main/java/com/deniscerri/ytdlnis/util/FileUtil.kt
diff --git a/.idea/.name b/.idea/.name
new file mode 100644
index 00000000..ca045245
--- /dev/null
+++ b/.idea/.name
@@ -0,0 +1 @@
+YTDLnis
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index 61a9130c..fb7f4a8a 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index cc6616c1..9b4350ec 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -167,7 +167,7 @@
-
+
diff --git a/app/build.gradle b/app/build.gradle
index 3377082d..524e3b39 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,8 +1,8 @@
-import java.util.regex.Pattern
-
plugins {
id 'com.android.application'
- id 'com.google.secrets_gradle_plugin' version '0.4'
+ id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin' version '2.0.1'
+ id 'org.jetbrains.kotlin.android'
+ id 'kotlin-kapt'
}
def properties = new Properties()
@@ -20,7 +20,7 @@ android {
keyPassword properties["signingConfig.keyPassword"]
}
}
- compileSdkVersion 31
+ compileSdkVersion 33
defaultConfig {
applicationId "com.deniscerri.ytdl"
minSdkVersion 23
@@ -32,8 +32,22 @@ android {
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a'
}
+ vectorDrawables {
+ useSupportLibrary true
+ }
+
+ kapt {
+ arguments {
+ arg("room.schemaLocation", "$projectDir/schemas")
+ }
+ }
}
+
+ sourceSets {
+ androidTest.assets.srcDirs += files("$projectDir/schemas".toString())
+ }
+
buildTypes {
release {
minifyEnabled false
@@ -53,6 +67,9 @@ android {
targetCompatibility JavaVersion.VERSION_1_8
}
+ kotlinOptions {
+ jvmTarget = '1.8'
+ }
splits {
abi {
@@ -62,9 +79,9 @@ android {
universalApk true
}
}
-
-
-
+ composeOptions {
+ kotlinCompilerExtensionVersion composeVer
+ }
}
@@ -80,13 +97,14 @@ dependencies {
implementation "androidx.appcompat:appcompat:$appCompatVer"
implementation "androidx.constraintlayout:constraintlayout:2.1.4"
- implementation 'com.google.android.material:material:1.6.1'
+ implementation 'com.google.android.material:material:1.7.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
- implementation 'androidx.core:core:1.8.0'
+ implementation 'androidx.core:core:1.9.0'
implementation 'androidx.recyclerview:recyclerview:1.2.1'
implementation 'androidx.preference:preference:1.2.0'
- implementation 'androidx.navigation:navigation-fragment:2.5.2'
- implementation 'androidx.navigation:navigation-ui:2.5.2'
+ implementation 'androidx.navigation:navigation-fragment:2.5.3'
+ implementation 'androidx.navigation:navigation-ui:2.5.3'
+ implementation 'androidx.core:core-ktx:1.9.0'
testImplementation "junit:junit:$junitVer"
androidTestImplementation "androidx.test.ext:junit:$androidJunitVer"
androidTestImplementation "androidx.test.espresso:espresso-core:$espressoVer"
@@ -102,4 +120,14 @@ dependencies {
implementation 'com.facebook.shimmer:shimmer:0.5.0'
implementation "androidx.work:work-runtime:$workVer"
+
+ implementation "androidx.room:room-runtime:2.4.3"
+ implementation "androidx.room:room-ktx:2.4.3"
+ kapt "androidx.room:room-compiler:2.4.3"
+ androidTestImplementation "androidx.room:room-testing:2.4.3"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ implementation "androidx.compose.runtime:runtime:$composeVer"
+
+
+ androidTestImplementation "com.google.truth:truth:1.1.3"
}
\ No newline at end of file
diff --git a/app/schemas/com.deniscerri.ytdlnis.database.DBManager/7.json b/app/schemas/com.deniscerri.ytdlnis.database.DBManager/7.json
new file mode 100644
index 00000000..3bb96a5e
--- /dev/null
+++ b/app/schemas/com.deniscerri.ytdlnis.database.DBManager/7.json
@@ -0,0 +1,192 @@
+{
+ "formatVersion": 1,
+ "database": {
+ "version": 7,
+ "identityHash": "9951239671c916d8805c4156bb69cb6b",
+ "entities": [
+ {
+ "tableName": "results",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `videoId` TEXT NOT NULL, `url` TEXT NOT NULL, `title` TEXT NOT NULL, `author` TEXT NOT NULL, `duration` TEXT NOT NULL, `thumb` TEXT NOT NULL, `downloadedAudio` INTEGER NOT NULL, `downloadedVideo` INTEGER NOT NULL, `isPlaylistItem` INTEGER NOT NULL, `website` TEXT NOT NULL, `downloadingAudio` INTEGER NOT NULL, `downloadingVideo` INTEGER NOT NULL, `playlistTitle` TEXT NOT NULL)",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "videoId",
+ "columnName": "videoId",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "url",
+ "columnName": "url",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "title",
+ "columnName": "title",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "author",
+ "columnName": "author",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "duration",
+ "columnName": "duration",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "thumb",
+ "columnName": "thumb",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "downloadedAudio",
+ "columnName": "downloadedAudio",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "downloadedVideo",
+ "columnName": "downloadedVideo",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "isPlaylistItem",
+ "columnName": "isPlaylistItem",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "website",
+ "columnName": "website",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "downloadingAudio",
+ "columnName": "downloadingAudio",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "downloadingVideo",
+ "columnName": "downloadingVideo",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "playlistTitle",
+ "columnName": "playlistTitle",
+ "affinity": "TEXT",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": true
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "history",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `url` TEXT NOT NULL, `title` TEXT NOT NULL, `author` TEXT NOT NULL, `duration` TEXT NOT NULL, `thumb` TEXT NOT NULL, `type` TEXT NOT NULL, `time` TEXT NOT NULL, `downloadPath` TEXT NOT NULL, `website` TEXT NOT NULL, `isQueuedDownload` INTEGER NOT NULL)",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "url",
+ "columnName": "url",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "title",
+ "columnName": "title",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "author",
+ "columnName": "author",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "duration",
+ "columnName": "duration",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "thumb",
+ "columnName": "thumb",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "type",
+ "columnName": "type",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "time",
+ "columnName": "time",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "downloadPath",
+ "columnName": "downloadPath",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "website",
+ "columnName": "website",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "isQueuedDownload",
+ "columnName": "isQueuedDownload",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": true
+ },
+ "indices": [],
+ "foreignKeys": []
+ }
+ ],
+ "views": [],
+ "setupQueries": [
+ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
+ "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '9951239671c916d8805c4156bb69cb6b')"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/deniscerri/ytdlnis/App.java b/app/src/main/java/com/deniscerri/ytdlnis/App.java
index 0edffec8..3ece600a 100644
--- a/app/src/main/java/com/deniscerri/ytdlnis/App.java
+++ b/app/src/main/java/com/deniscerri/ytdlnis/App.java
@@ -26,10 +26,8 @@ public class App extends Application {
public void onCreate() {
super.onCreate();
DynamicColors.applyToActivitiesIfAvailable(this);
-
notificationUtil = new NotificationUtil(this);
createNotificationChannels();
-
PreferenceManager.setDefaultValues(this, "root_preferences", this.MODE_PRIVATE, R.xml.root_preferences, false);
configureRxJavaErrorHandler();
Completable.fromAction(this::initLibraries).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new DisposableCompletableObserver() {
diff --git a/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.java b/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.java
deleted file mode 100644
index 601856a6..00000000
--- a/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.java
+++ /dev/null
@@ -1,359 +0,0 @@
-package com.deniscerri.ytdlnis;
-
-import android.Manifest;
-import android.app.Activity;
-import android.app.ActivityManager;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.content.SharedPreferences;
-import android.content.pm.PackageManager;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.provider.Settings;
-import android.util.Log;
-import android.view.View;
-import android.view.WindowInsets;
-
-import androidx.annotation.NonNull;
-import androidx.appcompat.app.AppCompatActivity;
-import androidx.core.app.ActivityCompat;
-import androidx.core.view.WindowInsetsCompat;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentManager;
-
-import com.deniscerri.ytdlnis.database.DBManager;
-import com.deniscerri.ytdlnis.database.Video;
-import com.deniscerri.ytdlnis.databinding.ActivityMainBinding;
-import com.deniscerri.ytdlnis.page.DownloadsFragment;
-import com.deniscerri.ytdlnis.page.HomeFragment;
-import com.deniscerri.ytdlnis.page.MoreFragment;
-import com.deniscerri.ytdlnis.page.settings.SettingsActivity;
-import com.deniscerri.ytdlnis.service.IDownloaderListener;
-import com.deniscerri.ytdlnis.service.IDownloaderService;
-import com.deniscerri.ytdlnis.util.UpdateUtil;
-import com.google.android.material.dialog.MaterialAlertDialogBuilder;
-import java.io.BufferedReader;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.List;
-
-public class MainActivity extends AppCompatActivity{
-
- ActivityMainBinding binding;
- Context context;
-
- private static final String TAG = "MainActivity";
-
- private HomeFragment homeFragment;
- private DownloadsFragment downloadsFragment;
- private MoreFragment moreFragment;
-
- private Fragment lastFragment;
- private FragmentManager fm;
-
- private boolean isDownloadServiceRunning = false;
- public DownloaderService downloaderService;
- private ArrayList listeners = null;
- private IDownloaderService iDownloaderService;
-
- public final ServiceConnection serviceConnection = new ServiceConnection() {
- @Override
- public void onServiceConnected(ComponentName className, IBinder service) {
- downloaderService = ((DownloaderService.LocalBinder) service).getService();
- iDownloaderService = (IDownloaderService) service;
- isDownloadServiceRunning = true;
- try{
- iDownloaderService.addActivity(MainActivity.this, listeners);
- for (int i = 0; i < listeners.size(); i++){
- IDownloaderListener listener = listeners.get(i);
- listener.onDownloadStart(iDownloaderService.getDownloadInfo());
- }
- }catch(Exception e){
- e.printStackTrace();
- }
- }
-
- @Override
- public void onServiceDisconnected(ComponentName componentName) {
- downloaderService = null;
- iDownloaderService = null;
- isDownloadServiceRunning = false;
- }
- };
-
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- binding = ActivityMainBinding.inflate(getLayoutInflater());
- super.onCreate(savedInstanceState);
-
- setContentView(R.layout.activity_main);
- setContentView(binding.getRoot());
- context = getBaseContext();
- reconnectDownloadService();
- checkUpdate();
-
- fm = getSupportFragmentManager();
-
- homeFragment = new HomeFragment();
- downloadsFragment = new DownloadsFragment();
- moreFragment = new MoreFragment();
-
- initFragments();
-
- binding.bottomNavigationView.setOnItemSelectedListener(item -> {
- int id = item.getItemId();
- if(id == R.id.home){
- if(lastFragment == homeFragment){
- homeFragment.scrollToTop();
- }else{
- this.setTitle(R.string.app_name);;
- }
- replaceFragment(homeFragment);
- }else if(id == R.id.downloads){
- if(lastFragment == downloadsFragment){
- downloadsFragment.scrollToTop();
- }else {
- this.setTitle(getString(R.string.downloads));
- }
- replaceFragment(downloadsFragment);
- }else if(id == R.id.more){
- if(lastFragment == moreFragment){
- Intent intent = new Intent(context, SettingsActivity.class);
- startActivity(intent);
- }else{
- this.setTitle(getString(R.string.more));
- }
- replaceFragment(moreFragment);
- }
- return true;
- });
-
- getWindow().getDecorView().setOnApplyWindowInsetsListener((view, windowInsets) -> {
- WindowInsetsCompat windowInsetsCompat = WindowInsetsCompat.toWindowInsetsCompat(windowInsets, view);
- boolean isImeVisible = windowInsetsCompat.isVisible(WindowInsetsCompat.Type.ime());
- binding.bottomNavigationView.setVisibility(isImeVisible ? View.GONE : View.VISIBLE);
- view.onApplyWindowInsets(windowInsets);
- return windowInsets;
- });
-
- askPermissions();
-
- Intent intent = getIntent();
- handleIntents(intent);
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- try {
- iDownloaderService.removeActivity(this);
- context.getApplicationContext().unbindService(serviceConnection);
- }catch (Exception e){
- e.printStackTrace();
- }
- }
-
- @Override
- protected void onNewIntent(Intent intent) {
- super.onNewIntent(intent);
- handleIntents(intent);
- }
-
- public void handleIntents(Intent intent){
- String action = intent.getAction();
- String type = intent.getType();
- if(Intent.ACTION_SEND.equals(action) && type != null){
- Log.e(TAG, action);
-
- homeFragment = new HomeFragment();
- downloadsFragment = new DownloadsFragment();
- moreFragment = new MoreFragment();
- if (type.equalsIgnoreCase("application/txt")){
- try{
- Uri uri = intent.getParcelableExtra(Intent.EXTRA_STREAM);
- InputStream is = getContentResolver().openInputStream(uri);
- StringBuilder textBuilder = new StringBuilder();
- Reader reader = new BufferedReader(new InputStreamReader
- (is, Charset.forName(StandardCharsets.UTF_8.name())));
- int c = 0;
- while ((c = reader.read()) != -1) {
- textBuilder.append((char) c);
- }
- List l = Arrays.asList(textBuilder.toString().split("\n"));
- LinkedList lines = new LinkedList<>(l);
- homeFragment.handleFileIntent(lines);
- }catch (Exception e){
- e.printStackTrace();
- }
- }else{
- homeFragment.handleIntent(intent);
- }
- initFragments();
- }
- }
-
- private void initFragments(){
- fm.beginTransaction()
- .replace(R.id.frame_layout, homeFragment)
- .add(R.id.frame_layout, downloadsFragment)
- .add(R.id.frame_layout, moreFragment)
- .hide(downloadsFragment)
- .hide(moreFragment)
- .commit();
-
- lastFragment = homeFragment;
-
- listeners = new ArrayList<>();
- listeners.add(homeFragment.listener);
- listeners.add(downloadsFragment.listener);
- }
-
- private void replaceFragment(Fragment f){
- fm.beginTransaction().hide(lastFragment).show(f).commit();
- lastFragment = f;
- }
-
- public void startDownloadService(ArrayList