From 91639641fa00f6103a2f798994d3ed7117ac717d Mon Sep 17 00:00:00 2001 From: Page Asgardius Date: Sun, 11 Sep 2022 09:21:46 -0700 Subject: [PATCH] bucket delete --- .../page/s3manager/BucketSelect.java | 172 ++++++++++++++---- .../page/s3manager/ObjectSelect.java | 8 +- app/src/main/res/drawable/create_new.png | Bin 0 -> 18118 bytes app/src/main/res/values/strings.xml | 3 + 4 files changed, 149 insertions(+), 34 deletions(-) create mode 100644 app/src/main/res/drawable/create_new.png diff --git a/app/src/main/java/asgardius/page/s3manager/BucketSelect.java b/app/src/main/java/asgardius/page/s3manager/BucketSelect.java index 771f256..32df96a 100644 --- a/app/src/main/java/asgardius/page/s3manager/BucketSelect.java +++ b/app/src/main/java/asgardius/page/s3manager/BucketSelect.java @@ -3,10 +3,12 @@ package asgardius.page.s3manager; import static android.media.MediaExtractor.MetricsConstants.MIME_TYPE; import static com.amazonaws.regions.Regions.US_EAST_1; +import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import android.content.DialogInterface; import android.content.Intent; import android.os.AsyncTask; import android.os.Build; @@ -24,6 +26,11 @@ 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.DeleteObjectRequest; +import com.amazonaws.services.s3.model.DeleteObjectsRequest; +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; @@ -35,6 +42,11 @@ public class BucketSelect extends AppCompatActivity { RecyclerView recyclerView; String username, password, endpoint, prefix, location, file; int treelevel; + Region region; + S3ClientOptions s3ClientOptions; + AWSCredentials myCredentials; + AmazonS3 s3client; + ProgressBar simpleProgressBar; @Override protected void onCreate(Bundle savedInstanceState) { @@ -45,18 +57,18 @@ public class BucketSelect extends AppCompatActivity { location = getIntent().getStringExtra("region"); prefix = ""; setContentView(R.layout.activity_bucket_select); - Region region = Region.getRegion("us-east-1"); - S3ClientOptions s3ClientOptions = S3ClientOptions.builder().build(); + region = Region.getRegion("us-east-1"); + s3ClientOptions = S3ClientOptions.builder().build(); if (!endpoint.contains(getResources().getString(R.string.aws_endpoint))) { s3ClientOptions.setPathStyleAccess(true); } - AWSCredentials myCredentials = new BasicAWSCredentials(username, password); - AmazonS3 s3client = new AmazonS3Client(myCredentials, region); + myCredentials = new BasicAWSCredentials(username, password); + s3client = new AmazonS3Client(myCredentials, region); s3client.setEndpoint(endpoint); s3client.setS3ClientOptions(s3ClientOptions); recyclerView = findViewById(R.id.blist); - final ProgressBar simpleProgressBar = (ProgressBar) findViewById(R.id.simpleProgressBar); + simpleProgressBar = (ProgressBar) findViewById(R.id.simpleProgressBar); // layout for vertical orientation LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getApplicationContext()); @@ -80,6 +92,11 @@ public class BucketSelect extends AppCompatActivity { //Img.add(R.drawable.ic_launcher_foreground); Img.add(R.drawable.bucket); } + if (Name.size() == 0) { + Name.add(getResources().getString(R.string.create_bucket)); + //Img.add(R.drawable.ic_launcher_foreground); + Img.add(R.drawable.create_new); + } //System.out.println(Name); runOnUiThread(new Runnable() { @@ -117,40 +134,43 @@ public class BucketSelect extends AppCompatActivity { @Override public void onClick(View view, int position) { //System.out.println("Click on "+Name.get(position).toString()); - explorer(Name.get(position).toString()); + if (Img.get(position).equals(R.drawable.bucket)) { + //go to bucket content + explorer(Name.get(position).toString()); + } else { + newBucket(); + } } @Override public void onLongClick(View view, int position) { //System.out.println("Long click on "+Name.get(position).toString()); - PopupMenu popupMenu = new PopupMenu(recyclerView.getContext(), view); + if (Img.get(position).equals(R.drawable.bucket)) { + PopupMenu popupMenu = new PopupMenu(recyclerView.getContext(), view); - // Inflating popup menu from popup_menu.xml file - popupMenu.getMenuInflater().inflate(R.menu.bucket_menu, popupMenu.getMenu()); - popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem menuItem) { - // Toast message on menu item clicked - //Toast.makeText(MainActivity.this, "You Clicked " + menuItem.getTitle(), Toast.LENGTH_SHORT).show(); - if (menuItem.getTitle() == getResources().getString(R.string.upload_tobucket)) { - //upload(); - upload(Name.get(position).toString()); - //System.out.println(file); - //Toast.makeText(BucketSelect.this, intent.getData().toString(), Toast.LENGTH_SHORT).show(); + // Inflating popup menu from popup_menu.xml file + popupMenu.getMenuInflater().inflate(R.menu.bucket_menu, popupMenu.getMenu()); + popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem menuItem) { + // Toast message on menu item clicked + //Toast.makeText(MainActivity.this, "You Clicked " + menuItem.getTitle(), Toast.LENGTH_SHORT).show(); + if (menuItem.getTitle() == getResources().getString(R.string.upload_tobucket)) { + //upload(); + upload(Name.get(position).toString()); + //System.out.println(file); + //Toast.makeText(BucketSelect.this, intent.getData().toString(), Toast.LENGTH_SHORT).show(); - } else if (menuItem.getTitle() == getResources().getString(R.string.file_del)) { - Toast.makeText(BucketSelect.this, getResources().getString(R.string.pending_feature), Toast.LENGTH_SHORT).show(); - /*if (Name.size() == 1 && treelevel >= 1) { - Toast.makeText(BucketSelect.this, getResources().getString(R.string.only_item_onlist), Toast.LENGTH_SHORT).show(); - } else { - delete(prefix + Name.get(position).toString(), true); - }*/ + } 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()); + } + return true; } - return true; - } - }); - // Showing the popup menu - popupMenu.show(); + }); + // Showing the popup menu + popupMenu.show(); + } } })); } @@ -170,6 +190,86 @@ public class BucketSelect extends AppCompatActivity { } + private void delete(String bucket) { + AlertDialog.Builder builder = new AlertDialog.Builder(BucketSelect.this); + builder.setCancelable(true); + builder.setTitle(getResources().getString(R.string.file_del)); + builder.setMessage(getResources().getString(R.string.bucket_del_confirm)); + builder.setPositiveButton(android.R.string.ok, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + //Toast.makeText(ObjectSelect.this, getResources().getString(R.string.pending_feature), Toast.LENGTH_SHORT).show(); + Thread deleteBucket = new Thread(new Runnable() { + + @Override + public void run() { + try { + //Your code goes here + ListObjectsRequest orequest = new ListObjectsRequest().withBucketName(bucket).withMaxKeys(8000); + //List objects = (List) s3client.listObjects(bucket, "/"); + ObjectListing result = s3client.listObjects(orequest); + ArrayList objectl = new ArrayList(); + List objects = result.getObjectSummaries(); + boolean nextbatch = false; + while (result.isTruncated() || !nextbatch) { + if (nextbatch) { + result = s3client.listNextBatchOfObjects (result); + objects = result.getObjectSummaries(); + } else { + nextbatch = true; + } + for (S3ObjectSummary os : objects) { + objectl.add(os.getKey()); + + //i++; + } + + } + //System.out.println(object); + DeleteObjectsRequest deleteObjectsRequest = new DeleteObjectsRequest(bucket).withKeys(objectl.toArray(new String[0])); + s3client.deleteObjects(deleteObjectsRequest); + s3client.deleteBucket(bucket); + runOnUiThread(new Runnable() { + + @Override + public void run() { + // Sending reference and data to Adapter + Toast.makeText(getApplicationContext(),getResources().getString(R.string.bucket_del_success), Toast.LENGTH_SHORT).show(); + recreate(); + + } + }); + //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(); + } + } + }); + simpleProgressBar.setVisibility(View.VISIBLE); + deleteBucket.start(); + } + }); + builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + } + }); + AlertDialog dialog = builder.create(); + dialog.show(); + } + private void upload(String bucket) { Intent intent = new Intent(this, Uploader.class); intent.putExtra("endpoint", endpoint); @@ -181,4 +281,14 @@ public class BucketSelect extends AppCompatActivity { startActivity(intent); } + private void newBucket() { + Toast.makeText(BucketSelect.this, getResources().getString(R.string.pending_feature), Toast.LENGTH_SHORT).show(); + /*Intent intent = new Intent(this, Uploader.class); + intent.putExtra("endpoint", endpoint); + intent.putExtra("username", username); + intent.putExtra("password", password); + intent.putExtra("region", location); + startActivity(intent);*/ + } + } \ 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 0b5dfc6..61eb60b 100644 --- a/app/src/main/java/asgardius/page/s3manager/ObjectSelect.java +++ b/app/src/main/java/asgardius/page/s3manager/ObjectSelect.java @@ -53,6 +53,7 @@ public class ObjectSelect extends AppCompatActivity { S3ClientOptions s3ClientOptions; AWSCredentials myCredentials; AmazonS3 s3client; + ProgressBar simpleProgressBar; @Override protected void onCreate(Bundle savedInstanceState) { @@ -78,7 +79,7 @@ public class ObjectSelect extends AppCompatActivity { recyclerView = findViewById(R.id.olist); - final ProgressBar simpleProgressBar = (ProgressBar) findViewById(R.id.simpleProgressBar); + simpleProgressBar = (ProgressBar) findViewById(R.id.simpleProgressBar); // layout for vertical orientation LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getApplicationContext()); @@ -370,7 +371,7 @@ public class ObjectSelect extends AppCompatActivity { @Override public void onClick(DialogInterface dialog, int which) { //Toast.makeText(ObjectSelect.this, getResources().getString(R.string.pending_feature), Toast.LENGTH_SHORT).show(); - Thread deleteobject = new Thread(new Runnable() { + Thread deleteObject = new Thread(new Runnable() { @Override public void run() { @@ -440,7 +441,8 @@ public class ObjectSelect extends AppCompatActivity { } } }); - deleteobject.start(); + simpleProgressBar.setVisibility(View.VISIBLE); + deleteObject.start(); } }); builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { diff --git a/app/src/main/res/drawable/create_new.png b/app/src/main/res/drawable/create_new.png new file mode 100644 index 0000000000000000000000000000000000000000..e32121034127ec581076a0beaa1325e7b69a2fbc GIT binary patch literal 18118 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
    uTD*ywhW$LO3RE4v7>_Wcu^P#`@ah=Y{ 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 feature is not implemented yet Open in Upload to this bucket + Create new bucket Upload in current folder Delete Do you want to delete this file? Do you want to delete this folder? + Do you want to delete this bucket? + Bucket deleted successfully Folder deleted successfully File deleted successfully This is the only item on this folder, you should delete the parent folder instead