package com.fastaccess.ui.modules.main; import android.content.Intent; import android.os.Bundle; import android.support.annotation.IdRes; import android.support.annotation.NonNull; import android.support.design.widget.AppBarLayout; import android.support.design.widget.CoordinatorLayout; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.NavigationView; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.text.Editable; import android.view.MenuItem; import android.view.View; import android.widget.Toast; import com.fastaccess.R; import com.fastaccess.helper.AnimHelper; import com.fastaccess.helper.AppHelper; import com.fastaccess.helper.Bundler; import com.fastaccess.helper.Logger; import com.fastaccess.helper.NotificationHelper; import com.fastaccess.helper.PermissionsHelper; import com.fastaccess.helper.PrefConstant; import com.fastaccess.provider.service.FloatingService; import com.fastaccess.ui.base.BaseActivity; import com.fastaccess.ui.modules.apps.device.DeviceAppsView; import com.fastaccess.ui.modules.cloud.auth.LoginView; import com.fastaccess.ui.modules.cloud.restore.RestoreView; import com.fastaccess.ui.modules.intro.IntroPagerView; import com.fastaccess.ui.modules.settings.SettingsView; import com.fastaccess.ui.modules.whats_new.WhatsNewView; import com.fastaccess.ui.widgets.FontEditText; import com.fastaccess.ui.widgets.ForegroundImageView; import com.fastaccess.ui.widgets.dialog.MessageDialogView; import com.google.android.gms.appinvite.AppInvite; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.api.GoogleApiClient; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; import butterknife.BindView; import butterknife.OnClick; import butterknife.OnTextChanged; import butterknife.OnTouch; import icepick.State; import it.sephiroth.android.library.bottomnavigation.BadgeProvider; import it.sephiroth.android.library.bottomnavigation.BottomNavigation; public class MainView extends BaseActivity<MainMvp.View, MainPresenter> implements MainMvp.View { public final static int BACKUP_REQUEST_CODE = 1; public final static int RESTORE_REQUEST_CODE = 2; @MainMvp.NavigationType @State int navType; @BindView(R.id.searchEditText) FontEditText searchEditText; @BindView(R.id.clear) ForegroundImageView clear; @BindView(R.id.appbar) AppBarLayout appbar; @BindView(R.id.coordinatorLayout) CoordinatorLayout coordinatorLayout; @BindView(R.id.navigation) NavigationView navigation; @BindView(R.id.drawerLayout) DrawerLayout drawerLayout; @BindView(R.id.bottomNavigation) BottomNavigation bottomNavigation; @BindView(R.id.fab) FloatingActionButton fab; private MainPresenter presenter; private BadgeProvider badgeProvider; private GoogleApiClient mGoogleApiClient; @OnClick(R.id.fab) void onClick() { if (navType == MainMvp.FOLDERS) { getPresenter().onCreateNewFolder(getSupportFragmentManager()); } } @OnTouch(R.id.searchEditText) boolean onTouch() { appbar.setExpanded(false, true); return false; } @OnTextChanged(value = R.id.searchEditText, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED) void onTextChange(Editable s) { String text = s.toString(); if (text.length() == 0) { getPresenter().onFilterResult(getSupportFragmentManager(), text); AnimHelper.animateVisibility(clear, false); } else { AnimHelper.animateVisibility(clear, true); getPresenter().onFilterResult(getSupportFragmentManager(), text); } } @OnClick(value = {R.id.searchIcon, R.id.clear}) void onClick(View view) { if (view.getId() == R.id.clear) { AppHelper.hideKeyboard(searchEditText); searchEditText.setText(""); } } @Override protected int layout() { return R.layout.activity_main; } @NonNull @Override protected MainPresenter getPresenter() { if (presenter == null) { presenter = MainPresenter.with(this); } return presenter; } @Override protected boolean isTransparent() { return true; } @Override protected boolean canBack() { return false; } @Override protected void onCreate(Bundle savedInstanceState) { setTheme(R.style.AppTheme); super.onCreate(savedInstanceState); if (savedInstanceState == null) { getSupportFragmentManager() .beginTransaction() .replace(R.id.container, DeviceAppsView.newInstance(), DeviceAppsView.TAG) .commit(); getPresenter().onHandleShortcuts(this, getIntent()); AppInvite.AppInviteApi.getInvitation(getGoogleApiClient(), this, false).setResultCallback(getPresenter()); } drawerLayout.setStatusBarBackground(R.color.primary_dark); setToolbarIcon(R.drawable.ic_menu); getPresenter().onActivityStarted(savedInstanceState, this, bottomNavigation, navigation); if (null != savedInstanceState) getBadgeProvider().restore(savedInstanceState); if (navType == MainMvp.FOLDERS) { fab.show(); } else { fab.hide(); } if (PrefConstant.showIntroScreen()) { startActivity(new Intent(this, IntroPagerView.class)); PrefConstant.setIntroScreen(); } if (PrefConstant.showWhatsNew()) { PrefConstant.setWhatsNewVersion(); startActivity(new Intent(this, WhatsNewView.class)); } } @Override public void onNavigationChanged(@MainMvp.NavigationType int navType) { //noinspection WrongConstant if (bottomNavigation.getSelectedIndex() != navType) bottomNavigation.setSelectedIndex(navType, true); this.navType = navType; getPresenter().onModuleChanged(getSupportFragmentManager(), navType); if (navType == MainMvp.FOLDERS) { fab.show(); } else { fab.hide(); } } @Override public void onOpenDrawer() { if (!drawerLayout.isDrawerOpen(GravityCompat.START)) drawerLayout.openDrawer(GravityCompat.START); } @Override public void onCloseDrawer() { if (drawerLayout.isDrawerOpen(GravityCompat.START)) drawerLayout.closeDrawer(GravityCompat.START); } @Override public void onOpenSettings() { startActivity(new Intent(this, SettingsView.class)); } @Override public void onStartService() { if (PermissionsHelper.systemAlertPermissionIsGranted(this)) { startService(new Intent(this, FloatingService.class)); } else { Toast.makeText(this, R.string.floating_window_warning, Toast.LENGTH_LONG).show(); } } @Override public void onStopService() { stopService(new Intent(this, FloatingService.class)); NotificationHelper.cancelAllNotifications(this); } @Override public void onShowBadge(@IdRes int itemId) { if (!getBadgeProvider().hasBadge(itemId)) { getBadgeProvider().show(itemId); onStartService(); } } @Override public void onHideBadge(@IdRes int itemId) { if (getBadgeProvider().hasBadge(itemId)) { getBadgeProvider().remove(itemId); } } @Override public void onSelectMenuItem(@IdRes int itemId) { navigation.getMenu().findItem(itemId).setChecked(true); } @Override public void onBackup() { MessageDialogView.newInstance(R.string.backup, R.string.backup_warning, BACKUP_REQUEST_CODE) .show(getSupportFragmentManager(), "MessageDialogView"); } @Override public void onRestore() { MessageDialogView.newInstance(R.string.restore, R.string.restore_warning, RESTORE_REQUEST_CODE) .show(getSupportFragmentManager(), "MessageDialogView"); } @Override public void onShareBackup() { FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser(); if (firebaseUser == null) { Toast.makeText(this, R.string.no_user, Toast.LENGTH_LONG).show(); } else { MessageDialogView.newInstance(R.string.share_my_backup, R.string.confirm_message) .show(getSupportFragmentManager(), "MessageDialogView"); } } @Override public void onRestoreFromUserId(@NonNull String userId) { Bundle bundle = Bundler.start().put(RestoreView.USER_ID_INTENT, userId).end(); Intent intent = new Intent(this, RestoreView.class); intent.putExtras(bundle); startActivity(intent); } @Override public void onOpenRate() { AppHelper.openAppInPlayStore(this); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { onOpenDrawer(); return true; } return super.onOptionsItemSelected(item); } @Override public void onBackPressed() { if (getPresenter().canBackPress(drawerLayout)) { super.onBackPressed(); } else { drawerLayout.closeDrawer(GravityCompat.START); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Logger.e(requestCode, resultCode, requestCode == PermissionsHelper.OVERLAY_PERMISSION_REQ_CODE); if (requestCode == PermissionsHelper.OVERLAY_PERMISSION_REQ_CODE) { if (PermissionsHelper.isSystemAlertGranted(this)) onStartService();//start service since the user wanted to in the first time but check // first if the permission is granted here otherwise we will run into infinite settings screen being opened. } } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); getPresenter().onHandleShortcuts(this, intent); AppInvite.AppInviteApi.getInvitation(getGoogleApiClient(), this, false).setResultCallback(getPresenter()); } @NonNull private BadgeProvider getBadgeProvider() { if (badgeProvider == null) { badgeProvider = bottomNavigation.getBadgeProvider(); } return badgeProvider; } @Override public void onMessageDialogActionClicked(boolean isOk, int requestCode) { if (isOk) { if (requestCode == BACKUP_REQUEST_CODE || requestCode == RESTORE_REQUEST_CODE) { getPresenter().onBackupRestore(requestCode == BACKUP_REQUEST_CODE ? LoginView.BACKUP_TYPE : LoginView.RESTORE_TYPE, this); } else { FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); if (user != null/* never will occur, but then we would like to make sure*/) getPresenter().onShareUserBackup(this, user); } } } @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { Toast.makeText(this, R.string.restore_function_not_available, Toast.LENGTH_LONG).show(); Logger.e(connectionResult); } private GoogleApiClient getGoogleApiClient() { if (mGoogleApiClient == null) { mGoogleApiClient = new GoogleApiClient.Builder(this) .enableAutoManage(this, this) .addApi(AppInvite.API) .build(); } return mGoogleApiClient; } }