package com.openfarmanager.android;
import android.Manifest;
import android.annotation.TargetApi;
import android.content.Intent;
import android.content.UriPermission;
import android.content.res.Configuration;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;
import com.dropbox.client2.exception.DropboxException;
import com.openfarmanager.android.controllers.FileSystemController;
import com.openfarmanager.android.controllers.FileSystemControllerSmartphone;
import com.openfarmanager.android.core.Settings;
import com.openfarmanager.android.core.network.NetworkConnectionManager;
import com.openfarmanager.android.core.network.dropbox.DropboxAPI;
import com.openfarmanager.android.fragments.BaseFileSystemPanel;
import com.openfarmanager.android.fragments.RequestPermissionFragment;
import com.openfarmanager.android.fragments.YesNoDialog;
import com.openfarmanager.android.model.NetworkEnum;
import com.openfarmanager.android.tips.MainTips;
import com.openfarmanager.android.toolbar.MenuBuilder;
import com.openfarmanager.android.toolbar.MenuItemImpl;
import com.openfarmanager.android.view.ToastNotification;
import com.openfarmanager.android.view.panels.MainToolbar;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import rx.Observable;
import rx.Subscriber;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.schedulers.Schedulers;
import rx.subscriptions.CompositeSubscription;
public class Main extends BaseActivity {
private static String TAG = "MainFragmentActivity";
public static int RESULT_SETTINGS_CHANGED = 100;
public static String RESULT_CODE_PANELS_MODE_CHANGED = "RESULT_CODE_PANELS_MODE_CHANGED";
public static String RESULT_BOTTOM_PANEL_INVALIDATE = "RESULT_BOTTOM_PANEL_INVALIDATE";
public static String RESULT_SHOW_HINT = "RESULT_SHOW_HINT";
public static String RESULT_REQUEST_SDCARD_ACCEESS = "RESULT_REQUEST_SDCARD_ACCEESS";
private FileSystemController mFileSystemController;
protected CompositeSubscription mSubscription;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == BaseFileSystemPanel.REQUEST_CODE_REQUEST_PERMISSION && Build.VERSION.SDK_INT >= 21 && data != null) {
getContentResolver().takePersistableUriPermission(data.getData(),
Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
return;
}
if (data != null && data.getBooleanExtra(RESULT_CODE_PANELS_MODE_CHANGED, false)) {
// Intent intent = getIntent();
// overridePendingTransition(0, 0);
// intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
// finish();
//
// overridePendingTransition(0, 0);
// startActivity(intent);
recreate();
}
if (data != null && data.getBooleanExtra(RESULT_BOTTOM_PANEL_INVALIDATE, false)) {
mFileSystemController.invalidateToolbar();
}
if (data != null && data.getBooleanExtra(RESULT_SHOW_HINT, false)) {
showTips();
}
if (data != null && data.getBooleanExtra(RESULT_REQUEST_SDCARD_ACCEESS, false)) {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, BaseFileSystemPanel.REQUEST_CODE_REQUEST_PERMISSION);
}
setupToolbarVisibility();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mSubscription = new CompositeSubscription();
App.sInstance.getNetworkConnectionManager().setRxSubscription(mSubscription);
setContentView(App.sInstance.getSettings().isMultiPanelMode() ? R.layout.main_two_panels : R.layout.main_one_panel);
if (findViewById(R.id.view_pager) == null) {
mFileSystemController = new FileSystemController(getSupportFragmentManager(), findViewById(R.id.root_view));
} else {
mFileSystemController = new FileSystemControllerSmartphone(getSupportFragmentManager(), findViewById(R.id.root_view));
}
App.sInstance.setFileSystemController(mFileSystemController);
mFileSystemController.restorePanelState();
if (askPermission(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE})) {
detectExternalStorages(new Runnable() {
@Override
public void run() {
showTips();
}
});
}
if (isHardwareKeyboardAvailable()) {
ToastNotification.makeText(App.sInstance.getApplicationContext(), getString(R.string.hardware_keyboard), Toast.LENGTH_LONG).show();
}
setupToolbarVisibility();
}
@TargetApi(21)
private void detectExternalStorages(final Runnable callback) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
callback.run();
return;
}
try {
File[] dirs = getExternalFilesDirs(null);
for (File dir : dirs) {
dir = dir.getParentFile().getParentFile().getParentFile().getParentFile();
if (Environment.isExternalStorageRemovable(dir) && !App.sInstance.getSettings().isSDCardPermissionAsked()) {
List<UriPermission> persistedUriPermissions = App.sInstance.getContentResolver().getPersistedUriPermissions();
if (persistedUriPermissions.size() == 0 || !persistedUriPermissions.get(0).isWritePermission()) {
try {
RequestPermissionFragment.newInstance(getString(R.string.sd_card_detected), new YesNoDialog.YesNoDialogListener() {
@Override
public void yes() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, BaseFileSystemPanel.REQUEST_CODE_REQUEST_PERMISSION);
}
@Override
public void no() {
App.sInstance.getSettings().setSDCardPermissionAsked(true);
callback.run();
}
}).show(getSupportFragmentManager(), "errorDialog");
return;
} catch (Exception ignore) {
}
}
}
}
callback.run();
} catch (Exception ignored) {
callback.run();
}
}
protected void onPermissionsResult(Map<String, Integer> permissions) {
showTips();
}
private boolean isHardwareKeyboardAvailable() {
return (getResources().getConfiguration().keyboard != Configuration.KEYBOARD_NOKEYS);
}
private void showTips() {
mFileSystemController.invalidate();
Settings settings = App.sInstance.getSettings();
if (settings.isShowTips()) {
new MainTips(this, mFileSystemController, (MainToolbar) findViewById(R.id.toolbar));
settings.getSharedPreferences().edit().putBoolean(Settings.SHOW_TIPS, false).apply();
}
}
@Override
protected void onResume() {
super.onResume();
(findViewById(R.id.panels_holder)).setBackgroundColor(App.sInstance.getSettings().getMainPanelColor());
final DropboxAPI dropboxAPI = App.sInstance.getDropboxApi();
if (dropboxAPI == null) {
return;
}
NetworkConnectionManager manager = App.sInstance.getNetworkConnectionManager();
if (dropboxAPI.getSession().authenticationSuccessful() && manager.isNetworkAuthRequested()) {
dropboxAPI.getSession().finishAuthentication();
manager.resetNetworkAuth();
mFileSystemController.showProgressDialog(R.string.loading);
Subscription subscription = Observable.create(new Observable.OnSubscribe<Void>() {
@Override
public void call(Subscriber<? super Void> subscriber) {
try {
com.dropbox.client2.DropboxAPI.Account account = dropboxAPI.accountInfo();
String userName = account.displayName + "(" + account.uid + ")";
dropboxAPI.storeAccessTokens(userName, dropboxAPI.getSession().getAccessTokenPair());
} catch (DropboxException e) {
e.printStackTrace();
}
subscriber.onNext(null);
}
}).subscribeOn(Schedulers.computation()).
observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<Void>() {
@Override
public void call(Void aVoid) {
mFileSystemController.dismissProgressDialog();
mFileSystemController.openNetworkPanel(NetworkEnum.Dropbox);
}
});
mSubscription.add(subscription);
}
}
@Override
protected void onPause() {
try {
super.onPause();
mFileSystemController.savePanelState();
} catch (IllegalStateException ignore) {
//something very unexpected, but there is a lot of crashes...
}
}
@Override
public void onDestroy() {
super.onDestroy();
mSubscription.unsubscribe();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (mFileSystemController.onKeyDown(keyCode, event))
return true;
return super.onKeyDown(keyCode, event);
}
@Override
protected void hideToolbar() {
mFileSystemController.hideMainToolbar();
}
@Override
protected void showToolbar() {
mFileSystemController.showMainToolbar();
}
@Override
protected Handler getHandler() {
return mFileSystemController.getToolbarHandler();
}
@Override
protected ArrayList<MenuItemImpl> getItems() {
Menu menu = new MenuBuilder(this);
int res = getResources().getIdentifier("main", "menu", getPackageName());
new MenuInflater(this).inflate(res, menu);
return ((MenuBuilder) menu).getAllActionItems();
}
@Override
protected void onToolbarItemSelected(MenuItem item) {
getHandler().sendEmptyMessage(MainToolbar.sActions.get(item.getItemId()));
}
}