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