1 /* 2 * Copyright 2021 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.example.android.receivecontent; 18 19 import android.net.Uri; 20 import android.os.Bundle; 21 import android.util.Log; 22 import android.view.Menu; 23 import android.view.MenuInflater; 24 import android.view.MenuItem; 25 import android.widget.EditText; 26 import android.widget.LinearLayout; 27 28 import androidx.annotation.NonNull; 29 import androidx.annotation.Nullable; 30 import androidx.appcompat.app.AppCompatActivity; 31 import androidx.appcompat.widget.Toolbar; 32 import androidx.recyclerview.widget.RecyclerView; 33 34 import com.google.common.collect.ImmutableList; 35 import com.google.common.util.concurrent.FutureCallback; 36 import com.google.common.util.concurrent.Futures; 37 import com.google.common.util.concurrent.ListenableFuture; 38 39 /** Main activity for the demo. */ 40 public class ReceiveContentDemoActivity extends AppCompatActivity { 41 private AttachmentsRepo mAttachmentsRepo; 42 private AttachmentsRecyclerViewAdapter mAttachmentsRecyclerViewAdapter; 43 44 @Override onCreate(@ullable Bundle savedInstanceState)45 protected void onCreate(@Nullable Bundle savedInstanceState) { 46 super.onCreate(savedInstanceState); 47 setContentView(R.layout.activity_main); 48 49 // Setup the app toolbar. 50 Toolbar toolbar = findViewById(R.id.app_toolbar); 51 setSupportActionBar(toolbar); 52 53 // Setup the repository and recycler view for attachments. 54 mAttachmentsRepo = new AttachmentsRepo(this); 55 ImmutableList<Uri> attachments = mAttachmentsRepo.getAllUris(); 56 RecyclerView attachmentsRecyclerView = findViewById(R.id.attachments_recycler_view); 57 attachmentsRecyclerView.setHasFixedSize(true); 58 mAttachmentsRecyclerViewAdapter = new AttachmentsRecyclerViewAdapter(attachments); 59 attachmentsRecyclerView.setAdapter(mAttachmentsRecyclerViewAdapter); 60 61 // Setup the listener for receiving content. 62 MyReceiver receiver = new MyReceiver(mAttachmentsRepo, mAttachmentsRecyclerViewAdapter); 63 LinearLayout container = findViewById(R.id.container); 64 container.setOnReceiveContentListener(MyReceiver.SUPPORTED_MIME_TYPES, receiver); 65 EditText textInput = findViewById(R.id.text_input); 66 textInput.setOnReceiveContentListener(MyReceiver.SUPPORTED_MIME_TYPES, receiver); 67 } 68 69 @Override onCreateOptionsMenu(@onNull Menu menu)70 public boolean onCreateOptionsMenu(@NonNull Menu menu) { 71 MenuInflater inflater = getMenuInflater(); 72 inflater.inflate(R.menu.app_menu, menu); 73 return true; 74 } 75 76 @Override onOptionsItemSelected(@onNull MenuItem item)77 public boolean onOptionsItemSelected(@NonNull MenuItem item) { 78 if (item.getItemId() == R.id.action_clear_attachments) { 79 deleteAllAttachments(); 80 return true; 81 } 82 return false; 83 } 84 deleteAllAttachments()85 private void deleteAllAttachments() { 86 ListenableFuture<Void> deleteAllFuture = MyExecutors.bg().submit(() -> { 87 mAttachmentsRepo.deleteAll(); 88 return null; 89 }); 90 Futures.addCallback(deleteAllFuture, new FutureCallback<Void>() { 91 @Override 92 public void onSuccess(@Nullable Void result) { 93 mAttachmentsRecyclerViewAdapter.clearAttachments(); 94 mAttachmentsRecyclerViewAdapter.notifyDataSetChanged(); 95 } 96 @Override 97 public void onFailure(@NonNull Throwable t) { 98 Log.e(Logcat.TAG, "Error deleting attachments", t); 99 } 100 }, MyExecutors.main()); 101 } 102 } 103