From 954f4b6f51a38b2a9ce2550b50132d17f0af317a Mon Sep 17 00:00:00 2001 From: Page Asgardius Date: Sun, 18 Sep 2022 11:49:30 -0700 Subject: [PATCH 001/218] new release --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 5d43582..c0d1b01 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ android { applicationId "asgardius.page.s3manager" minSdk 24 targetSdk 33 - versionCode 12 - versionName "0.1.10" + versionCode 13 + versionName "0.1.11" setProperty("archivesBaseName", "s3-manager-$versionName") testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" -- 2.39.2 From 055cd409598ea6657171113620ba708753c44339 Mon Sep 17 00:00:00 2001 From: Page Asgardius Date: Sun, 18 Sep 2022 12:57:56 -0700 Subject: [PATCH 002/218] new release --- app/build.gradle | 4 +- .../page/s3manager/ObjectSelect.java | 58 ++++++++++++++----- 2 files changed, 46 insertions(+), 16 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c0d1b01..b094678 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ android { applicationId "asgardius.page.s3manager" minSdk 24 targetSdk 33 - versionCode 13 - versionName "0.1.11" + versionCode 14 + versionName "0.1.12" setProperty("archivesBaseName", "s3-manager-$versionName") testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/java/asgardius/page/s3manager/ObjectSelect.java b/app/src/main/java/asgardius/page/s3manager/ObjectSelect.java index f187c93..1a56cc6 100644 --- a/app/src/main/java/asgardius/page/s3manager/ObjectSelect.java +++ b/app/src/main/java/asgardius/page/s3manager/ObjectSelect.java @@ -40,7 +40,7 @@ public class ObjectSelect extends AppCompatActivity { ArrayList Img; //ArrayList object; RecyclerView recyclerView; - String username, password, endpoint, bucket, prefix, location, pdfendpoint; + String username, password, endpoint, bucket, prefix, location, pdfendpoint, query; int treelevel; String[] filename; Region region; @@ -229,20 +229,50 @@ public class ObjectSelect extends AppCompatActivity { } } else if (Img.get(position).equals(R.drawable.pdffile)) { //load media file - try { - GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucket, prefix + Name.get(position).toString()); - URL objectURL = s3client.generatePresignedUrl(request); - //System.out.println(getResources().getString(R.string.pdf_reader)+ URLEncoder.encode(objectURL.toString(), "UTF-8" )); - if (pdfendpoint == null) { - Toast.makeText(getApplicationContext(),getResources().getString(R.string.pdf_reader_notready), Toast.LENGTH_SHORT).show(); - } else if (pdfendpoint.endsWith("/")) { - webBrowser(pdfendpoint + "web/viewer.html?file=" + URLEncoder.encode(objectURL.toString(), "UTF-8" ), Name.get(position).toString()); - } else { - webBrowser(pdfendpoint + "/web/viewer.html?file=" + URLEncoder.encode(objectURL.toString(), "UTF-8" ), Name.get(position).toString()); - } + Thread pdfread = new Thread(new Runnable() { - } catch (Exception e) { - Toast.makeText(getApplicationContext(),getResources().getString(R.string.media_list_fail), Toast.LENGTH_SHORT).show(); + @Override + public void run() { + try { + //Your code goes here + GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucket, prefix + Name.get(position).toString()); + URL objectURL = s3client.generatePresignedUrl(request); + //System.out.println(getResources().getString(R.string.pdf_reader)+ URLEncoder.encode(objectURL.toString(), "UTF-8" )); + if (pdfendpoint.endsWith("/")) { + query = pdfendpoint + "web/viewer.html?file=" + URLEncoder.encode(objectURL.toString(), "UTF-8" ); + } else { + query = pdfendpoint + "/web/viewer.html?file=" + URLEncoder.encode(objectURL.toString(), "UTF-8" ); + } + + runOnUiThread(new Runnable() { + + @Override + public void run() { + // Sending reference and data to Adapter + webBrowser(query, Name.get(position).toString()); + } + }); + //System.out.println("tree "+treelevel); + //System.out.println("prefix "+prefix); + + } catch (Exception e) { + e.printStackTrace(); + runOnUiThread(new Runnable() { + + @Override + public void run() { + Toast.makeText(getApplicationContext(),getResources().getString(R.string.media_list_fail), Toast.LENGTH_SHORT).show(); + } + }); + //Toast.makeText(getApplicationContext(),getResources().getString(R.string.media_list_fail), Toast.LENGTH_SHORT).show(); + finish(); + } + } + }); + if (pdfendpoint == null) { + Toast.makeText(getApplicationContext(),getResources().getString(R.string.pdf_reader_notready), Toast.LENGTH_SHORT).show(); + } else { + pdfread.start(); } } else if (Img.get(position).equals(R.drawable.audiofile) || Img.get(position).equals(R.drawable.videofile)) { //load media file -- 2.39.2 From 8fdfa82e3eb7f09c64ffe84f82f13ef84dc7c2ca Mon Sep 17 00:00:00 2001 From: Page Asgardius Date: Mon, 19 Sep 2022 07:50:34 -0700 Subject: [PATCH 003/218] dependency upgrade --- build.gradle | 4 ++-- gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 5ae9a7b..b15c903 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id 'com.android.application' version '7.2.2' apply false - id 'com.android.library' version '7.2.2' apply false + id 'com.android.application' version '7.3.0' apply false + id 'com.android.library' version '7.3.0' apply false } task clean(type: Delete) { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e606d51..10d2696 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Sat Aug 27 12:12:23 MST 2022 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME -- 2.39.2 From f0ae419b5487e5bbeaf520b35dfb8e5055f88724 Mon Sep 17 00:00:00 2001 From: Page Asgardius Date: Mon, 19 Sep 2022 08:26:29 -0700 Subject: [PATCH 004/218] update readme --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b9dae05..356a8f1 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,11 @@ File Explorer to manage servers compatible with S3 Object Storage Protocol + + Current feature list -* Audio and Video playback (opus, ogg, oga, mp3, m4a, flac, mka, mkv, mp4,, m4v, webm) +* Audio and Video playback (opus, ogg, oga, mp3, m4a, flac, mka, mkv, mp4, m4v, webm) * Picture preview (jpg, jpeg, png, gif) * Plain text file preview (txt, md) * Webpage viewer (htm, html) @@ -26,6 +28,8 @@ This app is a work in progress, so it have some bugs that need to be fixed You need to setup a pdf.js server to use pdf viewer. Just download latest version from official website and upload to any web server with ssl on same root domain than S3 server (can be same subdomain or a different one). Then set url to pdfjs root folder like https://example.com/pdfjs-dist +Steps to joining to Google Play Alpha testing channel are available at https://forum.asgardius.company/d/1-asgardius-s3-manager-testing + Supported languages * English -- 2.39.2 From c67e131f444e5b1734ab5a766b148b71a472c10b Mon Sep 17 00:00:00 2001 From: Page Asgardius Date: Mon, 19 Sep 2022 11:30:02 -0700 Subject: [PATCH 005/218] update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 356a8f1..679530f 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ Knnown issues * Object listing can be slow on buckets with a lot of objects (4000+) * Slow user interface on some low-end devices +* Running screen restarts after toggling system dark mode Known supported providers -- 2.39.2 From de6a44e29940779842fa0d37c17d8445fd0c27c1 Mon Sep 17 00:00:00 2001 From: Page Asgardius Date: Mon, 19 Sep 2022 11:31:57 -0700 Subject: [PATCH 006/218] update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 679530f..731677a 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ Current feature list Planned feature list * file sharing links +* better interface for uploads and downloads This app is a work in progress, so it have some bugs that need to be fixed -- 2.39.2 From a4ee613f5c8c517365ee5f8f37f1ad938722cd0b Mon Sep 17 00:00:00 2001 From: Page Asgardius Date: Mon, 19 Sep 2022 13:52:39 -0700 Subject: [PATCH 007/218] object info template --- app/src/main/AndroidManifest.xml | 8 +++ .../page/s3manager/BucketSelect.java | 15 +++++ .../asgardius/page/s3manager/ObjectInfo.java | 55 +++++++++++++++++++ .../page/s3manager/ObjectSelect.java | 18 ++++++ .../main/res/layout/activity_object_info.xml | 35 ++++++++++++ app/src/main/res/menu/bucket_menu.xml | 4 ++ app/src/main/res/menu/folder_menu.xml | 4 ++ app/src/main/res/menu/object_menu.xml | 4 ++ app/src/main/res/values-es/strings.xml | 3 + app/src/main/res/values/strings.xml | 3 + 10 files changed, 149 insertions(+) create mode 100644 app/src/main/java/asgardius/page/s3manager/ObjectInfo.java create mode 100644 app/src/main/res/layout/activity_object_info.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 894774b..1a20301 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -19,6 +19,14 @@ android:supportsRtl="true" android:theme="@style/Theme.AsgardiusS3Manager" tools:targetApi="31"> + + + diff --git a/app/src/main/java/asgardius/page/s3manager/BucketSelect.java b/app/src/main/java/asgardius/page/s3manager/BucketSelect.java index 60e4e28..2bf5ce2 100644 --- a/app/src/main/java/asgardius/page/s3manager/BucketSelect.java +++ b/app/src/main/java/asgardius/page/s3manager/BucketSelect.java @@ -165,6 +165,8 @@ public class BucketSelect extends AppCompatActivity { //System.out.println(file); //Toast.makeText(BucketSelect.this, intent.getData().toString(), Toast.LENGTH_SHORT).show(); + } else if (menuItem.getTitle() == getResources().getString(R.string.object_info)) { + objectInfo(Name.get(position).toString()); } else if (menuItem.getTitle() == getResources().getString(R.string.file_del)) { //Toast.makeText(BucketSelect.this, getResources().getString(R.string.pending_feature), Toast.LENGTH_SHORT).show(); delete(prefix + Name.get(position).toString()); @@ -288,6 +290,19 @@ public class BucketSelect extends AppCompatActivity { startActivity(intent); } + private void objectInfo(String bucket) { + + Intent intent = new Intent(this, ObjectInfo.class); + //treelevel ++; + intent.putExtra("endpoint", endpoint); + intent.putExtra("username", username); + intent.putExtra("password", password); + intent.putExtra("bucket", bucket); + intent.putExtra("region", location); + startActivity(intent); + + } + private void newBucket() { Intent intent = new Intent(this, CreateBucket.class); intent.putExtra("endpoint", endpoint); diff --git a/app/src/main/java/asgardius/page/s3manager/ObjectInfo.java b/app/src/main/java/asgardius/page/s3manager/ObjectInfo.java new file mode 100644 index 0000000..f91b74a --- /dev/null +++ b/app/src/main/java/asgardius/page/s3manager/ObjectInfo.java @@ -0,0 +1,55 @@ +package asgardius.page.s3manager; + +import androidx.appcompat.app.AppCompatActivity; + +import android.os.Bundle; +import android.view.View; +import android.widget.EditText; +import android.widget.ProgressBar; +import android.widget.TextView; +import android.widget.Toast; + +import com.amazonaws.auth.AWSCredentials; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.regions.Region; +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.AmazonS3Client; +import com.amazonaws.services.s3.S3ClientOptions; + +public class ObjectInfo extends AppCompatActivity { + String username, password, endpoint, bucket, object, location; + Region region; + S3ClientOptions s3ClientOptions; + AWSCredentials myCredentials; + AmazonS3 s3client; + ProgressBar simpleProgressBar; + TextView filesize; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_object_info); + simpleProgressBar = (ProgressBar) findViewById(R.id.simpleProgressBar); + filesize = (TextView) findViewById(R.id.size); + endpoint = getIntent().getStringExtra("endpoint"); + username = getIntent().getStringExtra("username"); + password = getIntent().getStringExtra("password"); + bucket = getIntent().getStringExtra("bucket"); + location = getIntent().getStringExtra("region"); + object = getIntent().getStringExtra("object"); + region = Region.getRegion(location); + s3ClientOptions = S3ClientOptions.builder().build(); + myCredentials = new BasicAWSCredentials(username, password); + try { + s3client = new AmazonS3Client(myCredentials, region); + } catch (Exception e) { + Toast.makeText(getApplicationContext(),getResources().getString(R.string.media_list_fail), Toast.LENGTH_SHORT).show(); + } + s3client.setEndpoint(endpoint); + if (!endpoint.contains(getResources().getString(R.string.aws_endpoint))) { + s3ClientOptions.setPathStyleAccess(true); + } + s3client.setS3ClientOptions(s3ClientOptions); + simpleProgressBar.setVisibility(View.INVISIBLE); + } +} \ No newline at end of file diff --git a/app/src/main/java/asgardius/page/s3manager/ObjectSelect.java b/app/src/main/java/asgardius/page/s3manager/ObjectSelect.java index 1a56cc6..f57d5b7 100644 --- a/app/src/main/java/asgardius/page/s3manager/ObjectSelect.java +++ b/app/src/main/java/asgardius/page/s3manager/ObjectSelect.java @@ -306,6 +306,8 @@ public class ObjectSelect extends AppCompatActivity { if (menuItem.getTitle() == getResources().getString(R.string.upload_file_here)) { //Toast.makeText(ObjectSelect.this, getResources().getString(R.string.pending_feature), Toast.LENGTH_SHORT).show(); upload(); + } else if (menuItem.getTitle() == getResources().getString(R.string.object_info)) { + objectInfo(prefix + Name.get(position).toString()); } else if (menuItem.getTitle() == getResources().getString(R.string.file_del)) { if (Name.size() == 1 && treelevel >= 1) { Toast.makeText(ObjectSelect.this, getResources().getString(R.string.only_item_onlist), Toast.LENGTH_SHORT).show(); @@ -337,6 +339,8 @@ public class ObjectSelect extends AppCompatActivity { upload(); } else if (menuItem.getTitle() == getResources().getString(R.string.file_share)) { share(prefix + Name.get(position).toString()); + } else if (menuItem.getTitle() == getResources().getString(R.string.object_info)) { + objectInfo(prefix + Name.get(position).toString()); } else if (menuItem.getTitle() == getResources().getString(R.string.file_del)) { if (menuItem.getTitle() == getResources().getString(R.string.file_del)) { if (Name.size() == 1 && treelevel >= 1) { @@ -418,6 +422,20 @@ public class ObjectSelect extends AppCompatActivity { } + private void objectInfo(String object) { + + Intent intent = new Intent(this, ObjectInfo.class); + //treelevel ++; + intent.putExtra("endpoint", endpoint); + intent.putExtra("username", username); + intent.putExtra("password", password); + intent.putExtra("bucket", bucket); + intent.putExtra("object", object); + intent.putExtra("region", location); + startActivity(intent); + + } + private void delete(String object, boolean folder) { AlertDialog.Builder builder = new AlertDialog.Builder(ObjectSelect.this); builder.setCancelable(true); diff --git a/app/src/main/res/layout/activity_object_info.xml b/app/src/main/res/layout/activity_object_info.xml new file mode 100644 index 0000000..a67b7c6 --- /dev/null +++ b/app/src/main/res/layout/activity_object_info.xml @@ -0,0 +1,35 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/bucket_menu.xml b/app/src/main/res/menu/bucket_menu.xml index 3c3e897..047028e 100644 --- a/app/src/main/res/menu/bucket_menu.xml +++ b/app/src/main/res/menu/bucket_menu.xml @@ -9,6 +9,10 @@ android:id="@+id/newbucket" android:title="@string/create_bucket" /> + + diff --git a/app/src/main/res/menu/folder_menu.xml b/app/src/main/res/menu/folder_menu.xml index 1e64433..a5f1e60 100644 --- a/app/src/main/res/menu/folder_menu.xml +++ b/app/src/main/res/menu/folder_menu.xml @@ -5,6 +5,10 @@ android:id="@+id/upload_file" android:title="@string/upload_file_here" /> + + diff --git a/app/src/main/res/menu/object_menu.xml b/app/src/main/res/menu/object_menu.xml index 056673d..9ab71e9 100644 --- a/app/src/main/res/menu/object_menu.xml +++ b/app/src/main/res/menu/object_menu.xml @@ -13,6 +13,10 @@ android:id="@+id/sharefile" android:title="@string/file_share" /> + + diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 3a731ff..f8922f9 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -77,4 +77,7 @@ Hora de expiración Crear enlace al archivo La fecha de caducidad debe ser inferior a 7 días + Tamaño del objeto + Propiedades + Abir en \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 41aeab3..b74cd62 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -24,6 +24,7 @@ Bucket name A bucket name is required Share file + Open in Download file Download in progress File downloaded successfully @@ -39,6 +40,8 @@ Retry Download failed Success + Properties + Object Size Create new bucket Bucket created successfully Upload file in current folder -- 2.39.2 From c86383cfb04c1d8041aa6089169f2c176988cc19 Mon Sep 17 00:00:00 2001 From: Page Asgardius Date: Tue, 20 Sep 2022 08:07:24 -0700 Subject: [PATCH 008/218] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 731677a..dc82f5a 100644 --- a/README.md +++ b/README.md @@ -19,10 +19,10 @@ Current feature list * File upload * File download * pdf file reader using user provided pdf.js server +* file sharing links Planned feature list -* file sharing links * better interface for uploads and downloads This app is a work in progress, so it have some bugs that need to be fixed -- 2.39.2 From ac1858ba2b6ec1fb685ced7d392b6f22ad1d03f7 Mon Sep 17 00:00:00 2001 From: Page Asgardius Date: Wed, 21 Sep 2022 10:53:07 -0700 Subject: [PATCH 009/218] object-info-interface --- .../asgardius/page/s3manager/ObjectInfo.java | 59 ++++++++++++++++++- .../main/res/layout/activity_object_info.xml | 1 - app/src/main/res/values-es/strings.xml | 4 +- app/src/main/res/values/strings.xml | 4 +- 4 files changed, 63 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/asgardius/page/s3manager/ObjectInfo.java b/app/src/main/java/asgardius/page/s3manager/ObjectInfo.java index f91b74a..a084ce2 100644 --- a/app/src/main/java/asgardius/page/s3manager/ObjectInfo.java +++ b/app/src/main/java/asgardius/page/s3manager/ObjectInfo.java @@ -15,6 +15,10 @@ import com.amazonaws.regions.Region; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.S3ClientOptions; +import com.amazonaws.services.s3.model.Bucket; + +import java.util.ArrayList; +import java.util.List; public class ObjectInfo extends AppCompatActivity { String username, password, endpoint, bucket, object, location; @@ -23,7 +27,8 @@ public class ObjectInfo extends AppCompatActivity { AWSCredentials myCredentials; AmazonS3 s3client; ProgressBar simpleProgressBar; - TextView filesize; + TextView filesize, filesizeinfo; + boolean isobject, isfolder; @Override protected void onCreate(Bundle savedInstanceState) { @@ -31,6 +36,7 @@ public class ObjectInfo extends AppCompatActivity { setContentView(R.layout.activity_object_info); simpleProgressBar = (ProgressBar) findViewById(R.id.simpleProgressBar); filesize = (TextView) findViewById(R.id.size); + filesizeinfo = (TextView) findViewById(R.id.size_info); endpoint = getIntent().getStringExtra("endpoint"); username = getIntent().getStringExtra("username"); password = getIntent().getStringExtra("password"); @@ -50,6 +56,55 @@ public class ObjectInfo extends AppCompatActivity { s3ClientOptions.setPathStyleAccess(true); } s3client.setS3ClientOptions(s3ClientOptions); - simpleProgressBar.setVisibility(View.INVISIBLE); + Thread getInfo = new Thread(new Runnable() { + + @Override + public void run() { + try { + //Your code goes here + if (object == null) { + isobject = false; + } else { + isobject = true; + if (object.endsWith("/")) { + isfolder = true; + } else { + isfolder = false; + } + } + + + runOnUiThread(new Runnable() { + + @Override + public void run() { + if (isobject) { + if (isfolder) { + filesizeinfo.setText(getResources().getString(R.string.folder_size)); + } else { + filesizeinfo.setText(getResources().getString(R.string.file_size)); + } + } else { + filesizeinfo.setText(getResources().getString(R.string.bucket_size)); + } + simpleProgressBar.setVisibility(View.INVISIBLE); + } + }); + + } catch (Exception e) { + e.printStackTrace(); + runOnUiThread(new Runnable() { + + @Override + public void run() { + Toast.makeText(getApplicationContext(),getResources().getString(R.string.media_list_fail), Toast.LENGTH_SHORT).show(); + } + }); + //Toast.makeText(getApplicationContext(),getResources().getString(R.string.media_list_fail), Toast.LENGTH_SHORT).show(); + finish(); + } + } + }); + getInfo.start(); } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_object_info.xml b/app/src/main/res/layout/activity_object_info.xml index a67b7c6..a58d65f 100644 --- a/app/src/main/res/layout/activity_object_info.xml +++ b/app/src/main/res/layout/activity_object_info.xml @@ -11,7 +11,6 @@ android:id="@+id/size_info" android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="@string/object_size" android:textAlignment="center" android:textSize="25sp" /> diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index f8922f9..0ab688b 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -77,7 +77,9 @@ Hora de expiración Crear enlace al archivo La fecha de caducidad debe ser inferior a 7 días - Tamaño del objeto + Tamaño del archivo Propiedades Abir en + Tamaño de la carpeta + Tamaño del bucket \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b74cd62..e1ff853 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -41,7 +41,9 @@ Download failed Success Properties - Object Size + File Size + Folder Size + Bucket Size Create new bucket Bucket created successfully Upload file in current folder -- 2.39.2 From 6729688096168ff0ecfc0e73722bcaab1cbe3470 Mon Sep 17 00:00:00 2001 From: Page Asgardius Date: Wed, 21 Sep 2022 11:43:18 -0700 Subject: [PATCH 010/218] get filesize --- .idea/deploymentTargetDropDown.xml | 10 +++++----- .../asgardius/page/s3manager/ObjectInfo.java | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index ac93b0d..14de87e 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -1,17 +1,17 @@ - + - + - + - - + + \ No newline at end of file diff --git a/app/src/main/java/asgardius/page/s3manager/ObjectInfo.java b/app/src/main/java/asgardius/page/s3manager/ObjectInfo.java index a084ce2..64c2c80 100644 --- a/app/src/main/java/asgardius/page/s3manager/ObjectInfo.java +++ b/app/src/main/java/asgardius/page/s3manager/ObjectInfo.java @@ -16,6 +16,9 @@ import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.S3ClientOptions; import com.amazonaws.services.s3.model.Bucket; +import com.amazonaws.services.s3.model.ListObjectsRequest; +import com.amazonaws.services.s3.model.ObjectListing; +import com.amazonaws.services.s3.model.S3ObjectSummary; import java.util.ArrayList; import java.util.List; @@ -29,6 +32,9 @@ public class ObjectInfo extends AppCompatActivity { ProgressBar simpleProgressBar; TextView filesize, filesizeinfo; boolean isobject, isfolder; + long totalSize = 0; + int totalItems = 0; + ListObjectsRequest orequest; @Override protected void onCreate(Bundle savedInstanceState) { @@ -64,6 +70,7 @@ public class ObjectInfo extends AppCompatActivity { //Your code goes here if (object == null) { isobject = false; + orequest = new ListObjectsRequest().withBucketName(bucket).withMaxKeys(8000); } else { isobject = true; if (object.endsWith("/")) { @@ -71,7 +78,16 @@ public class ObjectInfo extends AppCompatActivity { } else { isfolder = false; } + orequest = new ListObjectsRequest().withBucketName(bucket).withPrefix(object).withMaxKeys(8000); } + ObjectListing result = s3client.listObjects(orequest); + do { + for (S3ObjectSummary objectSummary : result.getObjectSummaries()) { + totalSize += objectSummary.getSize(); + totalItems++; + } + result = s3client.listNextBatchOfObjects (result); + } while (result.isTruncated()); runOnUiThread(new Runnable() { @@ -87,6 +103,7 @@ public class ObjectInfo extends AppCompatActivity { } else { filesizeinfo.setText(getResources().getString(R.string.bucket_size)); } + filesize.setText(Long.toString(totalSize)); simpleProgressBar.setVisibility(View.INVISIBLE); } }); -- 2.39.2 From 3682aaff4dd6861a9245032f0017d91f844b5211 Mon Sep 17 00:00:00 2001 From: Page Asgardius Date: Wed, 21 Sep 2022 11:57:50 -0700 Subject: [PATCH 011/218] make size human readable --- .idea/deploymentTargetDropDown.xml | 2 +- .../java/asgardius/page/s3manager/ObjectInfo.java | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index 14de87e..63cbf65 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -12,6 +12,6 @@ - + \ No newline at end of file diff --git a/app/src/main/java/asgardius/page/s3manager/ObjectInfo.java b/app/src/main/java/asgardius/page/s3manager/ObjectInfo.java index 64c2c80..ac1c11e 100644 --- a/app/src/main/java/asgardius/page/s3manager/ObjectInfo.java +++ b/app/src/main/java/asgardius/page/s3manager/ObjectInfo.java @@ -35,11 +35,15 @@ public class ObjectInfo extends AppCompatActivity { long totalSize = 0; int totalItems = 0; ListObjectsRequest orequest; + long KiB, MiB, GiB; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_object_info); + KiB = 1024; + MiB = 1024 * KiB; + GiB = 1024 * MiB; simpleProgressBar = (ProgressBar) findViewById(R.id.simpleProgressBar); filesize = (TextView) findViewById(R.id.size); filesizeinfo = (TextView) findViewById(R.id.size_info); @@ -103,7 +107,15 @@ public class ObjectInfo extends AppCompatActivity { } else { filesizeinfo.setText(getResources().getString(R.string.bucket_size)); } - filesize.setText(Long.toString(totalSize)); + if (totalSize >= GiB) { + filesize.setText(Long.toString(totalSize/GiB)+" GiB"); + } else if (totalSize >= MiB) { + filesize.setText(Long.toString(totalSize/MiB)+" MiB"); + } else if (totalSize >= KiB) { + filesize.setText(Long.toString(totalSize/KiB)+" KiB"); + } else { + filesize.setText(Long.toString(totalSize)+" Bytes"); + } simpleProgressBar.setVisibility(View.INVISIBLE); } }); -- 2.39.2 From 245f31bccbb1ce6857410b82c8e2394a3528bbdc Mon Sep 17 00:00:00 2001 From: Page Asgardius Date: Wed, 21 Sep 2022 18:59:50 -0700 Subject: [PATCH 012/218] fix sharing menu strings --- .idea/deploymentTargetDropDown.xml | 17 ----------------- .../asgardius/page/s3manager/ObjectSelect.java | 2 +- app/src/main/res/layout/activity_share.xml | 2 +- app/src/main/res/menu/object_menu.xml | 2 +- 4 files changed, 3 insertions(+), 20 deletions(-) delete mode 100644 .idea/deploymentTargetDropDown.xml diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml deleted file mode 100644 index 63cbf65..0000000 --- a/.idea/deploymentTargetDropDown.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/java/asgardius/page/s3manager/ObjectSelect.java b/app/src/main/java/asgardius/page/s3manager/ObjectSelect.java index f57d5b7..a65f095 100644 --- a/app/src/main/java/asgardius/page/s3manager/ObjectSelect.java +++ b/app/src/main/java/asgardius/page/s3manager/ObjectSelect.java @@ -337,7 +337,7 @@ public class ObjectSelect extends AppCompatActivity { } else if (menuItem.getTitle() == getResources().getString(R.string.upload_file_here)) { //Toast.makeText(ObjectSelect.this, getResources().getString(R.string.pending_feature), Toast.LENGTH_SHORT).show(); upload(); - } else if (menuItem.getTitle() == getResources().getString(R.string.file_share)) { + } else if (menuItem.getTitle() == getResources().getString(R.string.create_link)) { share(prefix + Name.get(position).toString()); } else if (menuItem.getTitle() == getResources().getString(R.string.object_info)) { objectInfo(prefix + Name.get(position).toString()); diff --git a/app/src/main/res/layout/activity_share.xml b/app/src/main/res/layout/activity_share.xml index 27942ff..45ed03d 100644 --- a/app/src/main/res/layout/activity_share.xml +++ b/app/src/main/res/layout/activity_share.xml @@ -112,7 +112,7 @@ android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" - android:text="@string/create_link" + android:text="@string/file_share" tools:ignore="MissingConstraints" /> diff --git a/app/src/main/res/menu/object_menu.xml b/app/src/main/res/menu/object_menu.xml index 9ab71e9..d8e0549 100644 --- a/app/src/main/res/menu/object_menu.xml +++ b/app/src/main/res/menu/object_menu.xml @@ -11,7 +11,7 @@ + android:title="@string/create_link" /> Date: Thu, 22 Sep 2022 08:05:15 -0700 Subject: [PATCH 013/218] working info screen --- .../main/java/asgardius/page/s3manager/ObjectInfo.java | 10 +++++++++- app/src/main/res/layout/activity_object_info.xml | 7 +++++++ app/src/main/res/values-es/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/asgardius/page/s3manager/ObjectInfo.java b/app/src/main/java/asgardius/page/s3manager/ObjectInfo.java index ac1c11e..ffbc132 100644 --- a/app/src/main/java/asgardius/page/s3manager/ObjectInfo.java +++ b/app/src/main/java/asgardius/page/s3manager/ObjectInfo.java @@ -30,7 +30,7 @@ public class ObjectInfo extends AppCompatActivity { AWSCredentials myCredentials; AmazonS3 s3client; ProgressBar simpleProgressBar; - TextView filesize, filesizeinfo; + TextView filesize, filesizeinfo, objectcount; boolean isobject, isfolder; long totalSize = 0; int totalItems = 0; @@ -47,12 +47,18 @@ public class ObjectInfo extends AppCompatActivity { simpleProgressBar = (ProgressBar) findViewById(R.id.simpleProgressBar); filesize = (TextView) findViewById(R.id.size); filesizeinfo = (TextView) findViewById(R.id.size_info); + objectcount = (TextView) findViewById(R.id.object_count); endpoint = getIntent().getStringExtra("endpoint"); username = getIntent().getStringExtra("username"); password = getIntent().getStringExtra("password"); bucket = getIntent().getStringExtra("bucket"); location = getIntent().getStringExtra("region"); object = getIntent().getStringExtra("object"); + if (object == null) { + getSupportActionBar().setTitle(bucket+"/"); + } else { + getSupportActionBar().setTitle(bucket+"/"+object); + } region = Region.getRegion(location); s3ClientOptions = S3ClientOptions.builder().build(); myCredentials = new BasicAWSCredentials(username, password); @@ -101,11 +107,13 @@ public class ObjectInfo extends AppCompatActivity { if (isobject) { if (isfolder) { filesizeinfo.setText(getResources().getString(R.string.folder_size)); + objectcount.setText(totalItems+" "+getResources().getString(R.string.file_count)); } else { filesizeinfo.setText(getResources().getString(R.string.file_size)); } } else { filesizeinfo.setText(getResources().getString(R.string.bucket_size)); + objectcount.setText(totalItems+" "+getResources().getString(R.string.file_count)); } if (totalSize >= GiB) { filesize.setText(Long.toString(totalSize/GiB)+" GiB"); diff --git a/app/src/main/res/layout/activity_object_info.xml b/app/src/main/res/layout/activity_object_info.xml index a58d65f..4a8f6c1 100644 --- a/app/src/main/res/layout/activity_object_info.xml +++ b/app/src/main/res/layout/activity_object_info.xml @@ -21,6 +21,13 @@ android:textAlignment="center" android:textSize="25sp" /> + + Abir en Tamaño de la carpeta Tamaño del bucket + archivos \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e1ff853..b5b23aa 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -44,6 +44,7 @@ File Size Folder Size Bucket Size + files Create new bucket Bucket created successfully Upload file in current folder -- 2.39.2 From 0e497074447643b1dd901cf5a10577c6b596766a Mon Sep 17 00:00:00 2001 From: Page Asgardius Date: Thu, 22 Sep 2022 09:55:40 -0700 Subject: [PATCH 014/218] object info ready --- README.md | 2 + app/build.gradle | 4 +- .../java/asgardius/page/s3manager/Share.java | 67 +++++++++++++------ app/src/main/res/layout/activity_share.xml | 8 +++ app/src/main/res/values-es/strings.xml | 3 +- app/src/main/res/values/strings.xml | 3 +- 6 files changed, 62 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index dc82f5a..8c0539e 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,8 @@ Current feature list * File download * pdf file reader using user provided pdf.js server * file sharing links +* get object info +* get bucket info Planned feature list diff --git a/app/build.gradle b/app/build.gradle index b094678..0c24d0b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ android { applicationId "asgardius.page.s3manager" minSdk 24 targetSdk 33 - versionCode 14 - versionName "0.1.12" + versionCode 15 + versionName "0.1.13" setProperty("archivesBaseName", "s3-manager-$versionName") testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/java/asgardius/page/s3manager/Share.java b/app/src/main/java/asgardius/page/s3manager/Share.java index 9f46d39..d46e657 100644 --- a/app/src/main/java/asgardius/page/s3manager/Share.java +++ b/app/src/main/java/asgardius/page/s3manager/Share.java @@ -31,7 +31,7 @@ public class Share extends AppCompatActivity { Calendar mycal; EditText datepick, monthpick, yearpick, hourpick, minutepick; int date, month, year, hour, minute; - Button share; + Button share, external; public static String URLify(String str) { str = str.trim(); @@ -73,6 +73,7 @@ public class Share extends AppCompatActivity { hourpick = (EditText)findViewById(R.id.Hour); minutepick = (EditText)findViewById(R.id.Minute); share = (Button)findViewById(R.id.share); + external = (Button)findViewById(R.id.open_in); endpoint = getIntent().getStringExtra("endpoint"); username = getIntent().getStringExtra("username"); password = getIntent().getStringExtra("password"); @@ -97,31 +98,55 @@ public class Share extends AppCompatActivity { public void onClick(View view) { //buttonaction try { - date = Integer.parseInt(datepick.getText().toString()); - month = Integer.parseInt(monthpick.getText().toString()); - year = Integer.parseInt(yearpick.getText().toString()); - hour = Integer.parseInt(hourpick.getText().toString()); - minute = Integer.parseInt(minutepick.getText().toString()); - mycal.set(Calendar.YEAR, year); - mycal.set(Calendar.MONTH, month-1); - mycal.set(Calendar.DATE, date); - mycal.set(Calendar.HOUR, hour); - mycal.set(Calendar.MINUTE, minute); - mycal.set(Calendar.SECOND, 0); - Date expiration = mycal.getTime(); - //System.out.println(expiration); - GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucket, object).withExpiration(expiration); - URL objectURL = s3client.generatePresignedUrl(request); - //System.out.println(URLify(objectURL.toString())); - Intent shareIntent = new Intent(Intent.ACTION_SEND); - shareIntent.setType("text/plain"); - shareIntent.putExtra(Intent.EXTRA_TEXT, URLify(objectURL.toString())); - startActivity(Intent.createChooser(shareIntent, "choose one")); + if (datepick.getText().toString().equals("") || monthpick.getText().toString().equals("") || + yearpick.getText().toString().equals("") || hourpick.getText().toString().equals("") || + minutepick.getText().toString().equals("")) { + Toast.makeText(getApplicationContext(),getResources().getString(R.string.null_expiration_date), Toast.LENGTH_SHORT).show(); + } else { + date = Integer.parseInt(datepick.getText().toString()); + month = Integer.parseInt(monthpick.getText().toString()); + year = Integer.parseInt(yearpick.getText().toString()); + hour = Integer.parseInt(hourpick.getText().toString()); + minute = Integer.parseInt(minutepick.getText().toString()); + mycal.set(Calendar.YEAR, year); + mycal.set(Calendar.MONTH, month-1); + mycal.set(Calendar.DATE, date); + mycal.set(Calendar.HOUR, hour); + mycal.set(Calendar.MINUTE, minute); + mycal.set(Calendar.SECOND, 0); + Date expiration = mycal.getTime(); + //System.out.println(expiration); + GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucket, object).withExpiration(expiration); + URL objectURL = s3client.generatePresignedUrl(request); + //System.out.println(URLify(objectURL.toString())); + Intent shareIntent = new Intent(Intent.ACTION_SEND); + shareIntent.setType("text/plain"); + shareIntent.putExtra(Intent.EXTRA_TEXT, URLify(objectURL.toString())); + startActivity(Intent.createChooser(shareIntent, "choose one")); + } } catch (Exception e) { Toast.makeText(getApplicationContext(),getResources().getString(R.string.invalid_expiration_date), Toast.LENGTH_SHORT).show(); } } }); + external.setOnClickListener(new View.OnClickListener(){ + @Override + public void onClick(View view) { + //buttonaction + try { + GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucket, object); + URL objectURL = s3client.generatePresignedUrl(request); + //System.out.println(URLify(objectURL.toString())); + Intent shareIntent = new Intent(Intent.ACTION_SEND); + shareIntent.setType("text/plain"); + shareIntent.putExtra(Intent.EXTRA_TEXT, URLify(objectURL.toString())); + startActivity(Intent.createChooser(shareIntent, "choose one")); + } catch (Exception e) { + Toast.makeText(getApplicationContext(),getResources().getString(R.string.invalid_expiration_date), Toast.LENGTH_SHORT).show(); + } + } + + }); } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_share.xml b/app/src/main/res/layout/activity_share.xml index 45ed03d..aba7813 100644 --- a/app/src/main/res/layout/activity_share.xml +++ b/app/src/main/res/layout/activity_share.xml @@ -115,6 +115,14 @@ android:text="@string/file_share" tools:ignore="MissingConstraints" /> +