diff --git a/Clover/app/src/main/AndroidManifest.xml b/Clover/app/src/main/AndroidManifest.xml index 86bb2077..f1efbee5 100644 --- a/Clover/app/src/main/AndroidManifest.xml +++ b/Clover/app/src/main/AndroidManifest.xml @@ -76,8 +76,6 @@ along with this program. If not, see . - - diff --git a/Clover/app/src/main/java/org/floens/chan/core/http/ReplyManager.java b/Clover/app/src/main/java/org/floens/chan/core/http/ReplyManager.java index 8d1a9e47..7ea1427f 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/http/ReplyManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/http/ReplyManager.java @@ -18,7 +18,6 @@ package org.floens.chan.core.http; import android.content.Context; -import android.content.Intent; import com.squareup.okhttp.OkHttpClient; import com.squareup.okhttp.Request; @@ -26,7 +25,6 @@ import com.squareup.okhttp.Request; import org.floens.chan.Chan; import org.floens.chan.core.model.Loadable; import org.floens.chan.core.model.Reply; -import org.floens.chan.ui.activity.ImagePickActivity; import java.io.File; import java.util.HashMap; @@ -40,7 +38,6 @@ public class ReplyManager { private static final int TIMEOUT = 30000; private final Context context; - private FileListener fileListener; private OkHttpClient client; private Map drafts = new HashMap<>(); @@ -77,51 +74,10 @@ public class ReplyManager { drafts.put(loadable, reply); } - /** - * Pick an file. Starts up the ImagePickActivity. - * - * @param listener FileListener to listen on. - */ - public void pickFile(FileListener listener) { - fileListener = listener; - - Intent intent = new Intent(context, ImagePickActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(intent); - } - public File getPickFile() { return new File(context.getCacheDir(), "picked_file"); } - public void _onFilePickLoading() { - if (fileListener != null) { - fileListener.onFilePickLoading(); - } - } - - public void _onFilePicked(String name, File file) { - if (fileListener != null) { - fileListener.onFilePicked(name, file); - fileListener = null; - } - } - - public void _onFilePickError(boolean cancelled) { - if (fileListener != null) { - fileListener.onFilePickError(cancelled); - fileListener = null; - } - } - - public interface FileListener { - void onFilePickLoading(); - - void onFilePicked(String name, File file); - - void onFilePickError(boolean cancelled); - } - public void makeHttpCall(HttpCall httpCall, HttpCallback callback) { httpCall.setCallback(callback); diff --git a/Clover/app/src/main/java/org/floens/chan/core/presenter/ReplyPresenter.java b/Clover/app/src/main/java/org/floens/chan/core/presenter/ReplyPresenter.java index 6e0005a3..8bd5106d 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/presenter/ReplyPresenter.java +++ b/Clover/app/src/main/java/org/floens/chan/core/presenter/ReplyPresenter.java @@ -33,6 +33,7 @@ import org.floens.chan.core.model.Reply; import org.floens.chan.core.model.SavedReply; import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.database.DatabaseManager; +import org.floens.chan.ui.helper.ImagePickDelegate; import org.floens.chan.ui.layout.CaptchaLayout; import java.io.File; @@ -43,7 +44,7 @@ import static org.floens.chan.utils.AndroidUtils.getReadableFileSize; import static org.floens.chan.utils.AndroidUtils.getRes; import static org.floens.chan.utils.AndroidUtils.getString; -public class ReplyPresenter implements ReplyManager.FileListener, ReplyManager.HttpCallback, CaptchaLayout.CaptchaCallback { +public class ReplyPresenter implements ReplyManager.HttpCallback, CaptchaLayout.CaptchaCallback, ImagePickDelegate.ImagePickCallback { public enum Page { INPUT, CAPTCHA, @@ -160,7 +161,7 @@ public class ReplyPresenter implements ReplyManager.FileListener, ReplyManager.H } previewOpen = false; } else { - Chan.getReplyManager().pickFile(this); + callback.getImagePickDelegate().pick(this); pickingFile = true; } } @@ -424,5 +425,7 @@ public class ReplyPresenter implements ReplyManager.FileListener, ReplyManager.H void highlightPostNo(int no); void showThread(Loadable loadable); + + ImagePickDelegate getImagePickDelegate(); } } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java index 592af0ce..e8834129 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java @@ -37,6 +37,7 @@ import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.ui.controller.BrowseController; import org.floens.chan.ui.controller.RootNavigationController; import org.floens.chan.ui.controller.ViewThreadController; +import org.floens.chan.ui.helper.ImagePickDelegate; import org.floens.chan.ui.state.ChanState; import org.floens.chan.ui.theme.ThemeHelper; import org.floens.chan.utils.Logger; @@ -56,6 +57,8 @@ public class StartActivity extends AppCompatActivity { private RootNavigationController rootNavigationController; private BrowseController browseController; + private ImagePickDelegate imagePickDelegate; + public StartActivity() { boardManager = Chan.getBoardManager(); } @@ -66,6 +69,8 @@ public class StartActivity extends AppCompatActivity { ThemeHelper.getInstance().setupContext(this); + imagePickDelegate = new ImagePickDelegate(this); + contentView = (ViewGroup) findViewById(android.R.id.content); rootNavigationController = new RootNavigationController(this); @@ -180,6 +185,10 @@ public class StartActivity extends AppCompatActivity { return contentView; } + public ImagePickDelegate getImagePickDelegate() { + return imagePickDelegate; + } + @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); @@ -233,6 +242,13 @@ public class StartActivity extends AppCompatActivity { Chan.getInstance().activityEnteredBackground(); } + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + + imagePickDelegate.onActivityResult(requestCode, resultCode, data); + } + private Controller stackTop() { return stack.get(stack.size() - 1); } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/ImagePickActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/helper/ImagePickDelegate.java similarity index 57% rename from Clover/app/src/main/java/org/floens/chan/ui/activity/ImagePickActivity.java rename to Clover/app/src/main/java/org/floens/chan/ui/helper/ImagePickDelegate.java index bdabaabe..0c994005 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/ImagePickActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/helper/ImagePickDelegate.java @@ -15,13 +15,12 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.floens.chan.ui.activity; +package org.floens.chan.ui.helper; import android.app.Activity; import android.content.Intent; import android.database.Cursor; import android.net.Uri; -import android.os.Bundle; import android.os.ParcelFileDescriptor; import android.provider.OpenableColumns; @@ -37,45 +36,60 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -public class ImagePickActivity extends Activity implements Runnable { +import static org.floens.chan.utils.AndroidUtils.runOnUiThread; + +public class ImagePickDelegate implements Runnable { private static final String TAG = "ImagePickActivity"; - private static final int IMAGE_RESULT = 1; + private static final int IMAGE_PICK_RESULT = 2; private static final long MAX_FILE_SIZE = 15 * 1024 * 1024; + private static final String DEFAULT_FILE_NAME = "file"; private ReplyManager replyManager; + private Activity activity; + + private ImagePickCallback callback; private Uri uri; - private String fileName = "file"; + private String fileName; private boolean success = false; private File cacheFile; - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + public ImagePickDelegate(Activity activity) { + this.activity = activity; replyManager = Chan.getReplyManager(); + } - Intent intent = new Intent(Intent.ACTION_GET_CONTENT); - intent.addCategory(Intent.CATEGORY_OPENABLE); - intent.setType("*/*"); - - if (intent.resolveActivity(getPackageManager()) != null) { - startActivityForResult(intent, IMAGE_RESULT); + public boolean pick(ImagePickCallback callback) { + if (this.callback != null) { + return false; } else { - Logger.e(TAG, "No activity found to get file with"); - replyManager._onFilePickError(false); + this.callback = callback; + + Intent intent = new Intent(Intent.ACTION_GET_CONTENT); + intent.addCategory(Intent.CATEGORY_OPENABLE); + intent.setType("*/*"); + + if (intent.resolveActivity(activity.getPackageManager()) != null) { + activity.startActivityForResult(intent, IMAGE_PICK_RESULT); + return true; + } else { + Logger.e(TAG, "No activity found to get file with"); + callback.onFilePickError(false); + reset(); + return false; + } } } - @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { boolean ok = false; boolean cancelled = false; - if (requestCode == IMAGE_RESULT) { - if (resultCode == RESULT_OK && data != null) { + if (requestCode == IMAGE_PICK_RESULT) { + if (resultCode == Activity.RESULT_OK && data != null) { uri = data.getData(); - Cursor returnCursor = getContentResolver().query(uri, null, null, null, null); + Cursor returnCursor = activity.getContentResolver().query(uri, null, null, null, null); if (returnCursor != null) { int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME); returnCursor.moveToFirst(); @@ -86,20 +100,29 @@ public class ImagePickActivity extends Activity implements Runnable { returnCursor.close(); } - replyManager._onFilePickLoading(); + if (fileName == null) { + // As per the comment on OpenableColumns.DISPLAY_NAME: + // If this is not provided then the name should default to the last segment of the file's URI. + fileName = uri.getLastPathSegment(); + } + + if (fileName == null) { + fileName = DEFAULT_FILE_NAME; + } + + callback.onFilePickLoading(); new Thread(this).start(); ok = true; - } else if (resultCode == RESULT_CANCELED) { + } else if (resultCode == Activity.RESULT_CANCELED) { cancelled = true; } } if (!ok) { - replyManager._onFilePickError(cancelled); + callback.onFilePickError(cancelled); + reset(); } - - finish(); } @Override @@ -110,7 +133,7 @@ public class ImagePickActivity extends Activity implements Runnable { InputStream is = null; OutputStream os = null; try { - fileDescriptor = getContentResolver().openFileDescriptor(uri, "r"); + fileDescriptor = activity.getContentResolver().openFileDescriptor(uri, "r"); is = new FileInputStream(fileDescriptor.getFileDescriptor()); os = new FileOutputStream(cacheFile); boolean fullyCopied = IOUtils.copy(is, os, MAX_FILE_SIZE); @@ -135,11 +158,28 @@ public class ImagePickActivity extends Activity implements Runnable { @Override public void run() { if (success) { - replyManager._onFilePicked(fileName, cacheFile); + callback.onFilePicked(fileName, cacheFile); } else { - replyManager._onFilePickError(false); + callback.onFilePickError(false); } + reset(); } }); } + + private void reset() { + callback = null; + cacheFile = null; + success = false; + fileName = null; + uri = null; + } + + public interface ImagePickCallback { + void onFilePickLoading(); + + void onFilePicked(String fileName, File file); + + void onFilePickError(boolean cancelled); + } } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/layout/ReplyLayout.java b/Clover/app/src/main/java/org/floens/chan/ui/layout/ReplyLayout.java index ae7d61d0..211e5f14 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/layout/ReplyLayout.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/layout/ReplyLayout.java @@ -38,6 +38,8 @@ import org.floens.chan.core.model.Loadable; import org.floens.chan.core.model.Reply; import org.floens.chan.core.presenter.ReplyPresenter; import org.floens.chan.core.settings.ChanSettings; +import org.floens.chan.ui.helper.ImagePickDelegate; +import org.floens.chan.ui.activity.StartActivity; import org.floens.chan.ui.drawable.DropdownArrowDrawable; import org.floens.chan.ui.theme.ThemeHelper; import org.floens.chan.ui.view.LoadView; @@ -396,6 +398,11 @@ public class ReplyLayout extends LoadView implements View.OnClickListener, Anima callback.showThread(loadable); } + @Override + public ImagePickDelegate getImagePickDelegate() { + return ((StartActivity) getContext()).getImagePickDelegate(); + } + public interface ReplyLayoutCallback { void highlightPostNo(int no);