Ammar Githam
4 years ago
1 changed files with 103 additions and 100 deletions
@ -1,129 +1,132 @@ |
|||||
package awais.instagrabber.activities; |
|
||||
|
package awais.instagrabber.activities |
||||
|
|
||||
import android.annotation.SuppressLint; |
|
||||
import android.content.ActivityNotFoundException; |
|
||||
import android.content.Intent; |
|
||||
import android.net.Uri; |
|
||||
import android.os.Build; |
|
||||
import android.os.Bundle; |
|
||||
import android.provider.DocumentsContract; |
|
||||
import android.util.Log; |
|
||||
import android.view.View; |
|
||||
|
import android.annotation.SuppressLint |
||||
|
import android.content.ActivityNotFoundException |
||||
|
import android.content.Intent |
||||
|
import android.net.Uri |
||||
|
import android.os.Build |
||||
|
import android.os.Bundle |
||||
|
import android.provider.DocumentsContract |
||||
|
import android.util.Log |
||||
|
import android.view.View |
||||
|
import androidx.lifecycle.ViewModelProvider |
||||
|
import awais.instagrabber.R |
||||
|
import awais.instagrabber.databinding.ActivityDirectorySelectBinding |
||||
|
import awais.instagrabber.dialogs.ConfirmDialogFragment |
||||
|
import awais.instagrabber.utils.AppExecutors.mainThread |
||||
|
import awais.instagrabber.utils.Constants |
||||
|
import awais.instagrabber.utils.extensions.TAG |
||||
|
import awais.instagrabber.viewmodels.DirectorySelectActivityViewModel |
||||
|
import java.io.IOException |
||||
|
import java.io.PrintWriter |
||||
|
import java.io.StringWriter |
||||
|
|
||||
import androidx.annotation.NonNull; |
|
||||
import androidx.annotation.Nullable; |
|
||||
import androidx.lifecycle.ViewModelProvider; |
|
||||
|
class DirectorySelectActivity : BaseLanguageActivity() { |
||||
|
private var initialUri: Uri? = null |
||||
|
|
||||
import java.io.IOException; |
|
||||
import java.io.PrintWriter; |
|
||||
import java.io.StringWriter; |
|
||||
|
private lateinit var binding: ActivityDirectorySelectBinding |
||||
|
private lateinit var viewModel: DirectorySelectActivityViewModel |
||||
|
|
||||
import awais.instagrabber.R; |
|
||||
import awais.instagrabber.databinding.ActivityDirectorySelectBinding; |
|
||||
import awais.instagrabber.dialogs.ConfirmDialogFragment; |
|
||||
import awais.instagrabber.utils.AppExecutors; |
|
||||
import awais.instagrabber.viewmodels.DirectorySelectActivityViewModel; |
|
||||
|
|
||||
public class DirectorySelectActivity extends BaseLanguageActivity { |
|
||||
private static final String TAG = DirectorySelectActivity.class.getSimpleName(); |
|
||||
public static final int SELECT_DIR_REQUEST_CODE = 0x01; |
|
||||
private static final int ERROR_REQUEST_CODE = 0x02; |
|
||||
|
|
||||
private Uri initialUri; |
|
||||
private ActivityDirectorySelectBinding binding; |
|
||||
private DirectorySelectActivityViewModel viewModel; |
|
||||
|
|
||||
@Override |
|
||||
protected void onCreate(@Nullable final Bundle savedInstanceState) { |
|
||||
super.onCreate(savedInstanceState); |
|
||||
binding = ActivityDirectorySelectBinding.inflate(getLayoutInflater()); |
|
||||
setContentView(binding.getRoot()); |
|
||||
viewModel = new ViewModelProvider(this).get(DirectorySelectActivityViewModel.class); |
|
||||
setupObservers(); |
|
||||
binding.selectDir.setOnClickListener(v -> openDirectoryChooser()); |
|
||||
AppExecutors.INSTANCE.getMainThread().execute(() -> viewModel.setInitialUri(getIntent())); |
|
||||
|
override fun onCreate(savedInstanceState: Bundle?) { |
||||
|
super.onCreate(savedInstanceState) |
||||
|
binding = ActivityDirectorySelectBinding.inflate(layoutInflater) |
||||
|
setContentView(binding.root) |
||||
|
viewModel = ViewModelProvider(this).get(DirectorySelectActivityViewModel::class.java) |
||||
|
val intent = intent |
||||
|
viewModel.setInitialUri(intent) |
||||
|
setupObservers() |
||||
|
binding.selectDir.setOnClickListener { openDirectoryChooser() } |
||||
|
initialUri = intent.getParcelableExtra(Constants.EXTRA_INITIAL_URI) |
||||
} |
} |
||||
|
|
||||
private void setupObservers() { |
|
||||
viewModel.getMessage().observe(this, message -> binding.message.setText(message)); |
|
||||
viewModel.getPrevUri().observe(this, prevUri -> { |
|
||||
|
private fun setupObservers() { |
||||
|
viewModel.message.observe(this, { message: String? -> binding.message.text = message }) |
||||
|
viewModel.prevUri.observe(this, { prevUri: String? -> |
||||
if (prevUri == null) { |
if (prevUri == null) { |
||||
binding.prevUri.setVisibility(View.GONE); |
|
||||
binding.message2.setVisibility(View.GONE); |
|
||||
return; |
|
||||
|
binding.prevUri.visibility = View.GONE |
||||
|
binding.message2.visibility = View.GONE |
||||
|
return@observe |
||||
} |
} |
||||
binding.prevUri.setText(prevUri); |
|
||||
binding.prevUri.setVisibility(View.VISIBLE); |
|
||||
binding.message2.setVisibility(View.VISIBLE); |
|
||||
}); |
|
||||
viewModel.getDirSuccess().observe(this, success -> binding.selectDir.setVisibility(success ? View.GONE : View.VISIBLE)); |
|
||||
viewModel.isLoading().observe(this, loading -> { |
|
||||
binding.message.setVisibility(loading ? View.GONE : View.VISIBLE); |
|
||||
binding.loadingIndicator.setVisibility(loading ? View.VISIBLE : View.GONE); |
|
||||
}); |
|
||||
|
binding.prevUri.text = prevUri |
||||
|
binding.prevUri.visibility = View.VISIBLE |
||||
|
binding.message2.visibility = View.VISIBLE |
||||
|
}) |
||||
|
viewModel.dirSuccess.observe(this, { success: Boolean -> binding.selectDir.visibility = if (success) View.GONE else View.VISIBLE }) |
||||
|
viewModel.isLoading.observe(this, { loading: Boolean -> |
||||
|
binding.message.visibility = if (loading) View.GONE else View.VISIBLE |
||||
|
binding.loadingIndicator.visibility = if (loading) View.VISIBLE else View.GONE |
||||
|
}) |
||||
} |
} |
||||
|
|
||||
private void openDirectoryChooser() { |
|
||||
final Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); |
|
||||
|
private fun openDirectoryChooser() { |
||||
|
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) |
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && initialUri != null) { |
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && initialUri != null) { |
||||
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, initialUri); |
|
||||
|
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, initialUri) |
||||
} |
} |
||||
try { |
try { |
||||
startActivityForResult(intent, SELECT_DIR_REQUEST_CODE); |
|
||||
} catch (ActivityNotFoundException e) { |
|
||||
Log.e(TAG, "openDirectoryChooser: ", e); |
|
||||
showErrorDialog(getString(R.string.no_directory_picker_activity)); |
|
||||
} catch (Exception e) { |
|
||||
Log.e(TAG, "openDirectoryChooser: ", e); |
|
||||
|
startActivityForResult(intent, SELECT_DIR_REQUEST_CODE) |
||||
|
} catch (e: ActivityNotFoundException) { |
||||
|
Log.e(TAG, "openDirectoryChooser: ", e) |
||||
|
showErrorDialog(getString(R.string.no_directory_picker_activity)) |
||||
|
} catch (e: Exception) { |
||||
|
Log.e(TAG, "openDirectoryChooser: ", e) |
||||
} |
} |
||||
} |
} |
||||
|
|
||||
@SuppressLint("StringFormatInvalid") |
@SuppressLint("StringFormatInvalid") |
||||
@Override |
|
||||
protected void onActivityResult(final int requestCode, final int resultCode, @Nullable final Intent data) { |
|
||||
super.onActivityResult(requestCode, resultCode, data); |
|
||||
if (requestCode != SELECT_DIR_REQUEST_CODE) return; |
|
||||
|
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { |
||||
|
super.onActivityResult(requestCode, resultCode, data) |
||||
|
if (requestCode != SELECT_DIR_REQUEST_CODE) return |
||||
if (resultCode != RESULT_OK) { |
if (resultCode != RESULT_OK) { |
||||
showErrorDialog(getString(R.string.select_a_folder)); |
|
||||
return; |
|
||||
|
showErrorDialog(getString(R.string.select_a_folder)) |
||||
|
return |
||||
} |
} |
||||
if (data == null || data.getData() == null) { |
|
||||
showErrorDialog(getString(R.string.select_a_folder)); |
|
||||
return; |
|
||||
|
if (data == null || data.data == null) { |
||||
|
showErrorDialog(getString(R.string.select_a_folder)) |
||||
|
return |
||||
} |
} |
||||
if (!"com.android.externalstorage.documents".equals(data.getData().getAuthority())) { |
|
||||
showErrorDialog(getString(R.string.dir_select_no_download_folder, data.getData().getAuthority())); |
|
||||
return; |
|
||||
|
val authority = data.data?.authority |
||||
|
if ("com.android.externalstorage.documents" != authority) { |
||||
|
showErrorDialog(getString(R.string.dir_select_no_download_folder, authority)) |
||||
|
return |
||||
} |
} |
||||
AppExecutors.INSTANCE.getMainThread().execute(() -> { |
|
||||
|
mainThread.execute({ |
||||
try { |
try { |
||||
viewModel.setupSelectedDir(data); |
|
||||
final Intent intent = new Intent(this, MainActivity.class); |
|
||||
startActivity(intent); |
|
||||
finish(); |
|
||||
} catch (Exception e) { |
|
||||
|
viewModel.setupSelectedDir(data) |
||||
|
val intent = Intent(this, MainActivity::class.java) |
||||
|
startActivity(intent) |
||||
|
finish() |
||||
|
} catch (e: Exception) { |
||||
// Should not come to this point. |
// Should not come to this point. |
||||
// If it does, we have to show this error to the user so that they can report it. |
// If it does, we have to show this error to the user so that they can report it. |
||||
try (final StringWriter sw = new StringWriter(); |
|
||||
final PrintWriter pw = new PrintWriter(sw)) { |
|
||||
e.printStackTrace(pw); |
|
||||
showErrorDialog("Please report this error to the developers:\n\n" + sw.toString()); |
|
||||
} catch (IOException ioException) { |
|
||||
Log.e(TAG, "onActivityResult: ", ioException); |
|
||||
|
try { |
||||
|
StringWriter().use { sw -> |
||||
|
PrintWriter(sw).use { pw -> |
||||
|
e.printStackTrace(pw) |
||||
|
showErrorDialog("Please report this error to the developers:\n\n$sw") |
||||
|
} |
||||
|
} |
||||
|
} catch (ioException: IOException) { |
||||
|
Log.e(TAG, "onActivityResult: ", ioException) |
||||
} |
} |
||||
} |
} |
||||
}, 500); |
|
||||
|
}, 500) |
||||
|
} |
||||
|
|
||||
|
private fun showErrorDialog(message: String) { |
||||
|
val dialogFragment = ConfirmDialogFragment.newInstance( |
||||
|
ERROR_REQUEST_CODE, |
||||
|
R.string.error, |
||||
|
message, |
||||
|
R.string.ok, |
||||
|
0, |
||||
|
0 |
||||
|
) |
||||
|
dialogFragment.show(supportFragmentManager, ConfirmDialogFragment::class.java.simpleName) |
||||
} |
} |
||||
|
|
||||
private void showErrorDialog(@NonNull final String message) { |
|
||||
final ConfirmDialogFragment dialogFragment = ConfirmDialogFragment.newInstance( |
|
||||
ERROR_REQUEST_CODE, |
|
||||
R.string.error, |
|
||||
message, |
|
||||
R.string.ok, |
|
||||
0, |
|
||||
0 |
|
||||
); |
|
||||
dialogFragment.show(getSupportFragmentManager(), ConfirmDialogFragment.class.getSimpleName()); |
|
||||
|
companion object { |
||||
|
const val SELECT_DIR_REQUEST_CODE = 0x01 |
||||
|
private const val ERROR_REQUEST_CODE = 0x02 |
||||
} |
} |
||||
} |
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue