package com.fastaccess.ui.modules.main; import android.content.Intent; import android.graphics.Typeface; import android.net.Uri; import android.os.Bundle; import android.support.annotation.IdRes; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.NavigationView; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.ShareCompat; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.view.MenuItem; import com.fastaccess.BuildConfig; import com.fastaccess.R; import com.fastaccess.helper.Bundler; import com.fastaccess.helper.InputHelper; import com.fastaccess.helper.Logger; import com.fastaccess.helper.PrefConstant; import com.fastaccess.helper.PrefHelper; import com.fastaccess.helper.TypeFaceHelper; import com.fastaccess.ui.base.mvp.presenter.BasePresenter; import com.fastaccess.ui.modules.apps.device.DeviceAppsView; import com.fastaccess.ui.modules.apps.folders.FoldersView; import com.fastaccess.ui.modules.apps.selected.SelectedAppsView; import com.fastaccess.ui.modules.cloud.auth.LoginView; import com.google.android.gms.appinvite.AppInviteInvitationResult; import com.google.android.gms.appinvite.AppInviteReferral; import com.google.firebase.auth.FirebaseUser; import it.sephiroth.android.library.bottomnavigation.BottomNavigation; import static com.fastaccess.helper.AppHelper.getFragmentByTag; import static com.fastaccess.helper.AppHelper.getVisibleFragment; /** * Created by Kosh on 10 Oct 2016, 11:13 PM */ public class MainPresenter extends BasePresenter<MainMvp.View> implements MainMvp.Presenter { private MainPresenter(@NonNull MainMvp.View view) { super(view); } public static MainPresenter with(MainMvp.View view) { return new MainPresenter(view); } @Override public void onActivityStarted(@Nullable Bundle savedInstance, @NonNull MainView mainView, @NonNull BottomNavigation bottomNavigation, @NonNull NavigationView navigationView) { navigationView.setNavigationItemSelectedListener(this); Typeface myTypeface = TypeFaceHelper.getTypeface(); bottomNavigation.setDefaultTypeface(myTypeface); bottomNavigation.setOnMenuItemClickListener(this); if (savedInstance == null) { bottomNavigation.setDefaultSelectedIndex(0); } } @Override public boolean canBackPress(@NonNull DrawerLayout drawerLayout) { return !drawerLayout.isDrawerOpen(GravityCompat.START); } @SuppressWarnings("ConstantConditions") @Override public void onModuleChanged(@NonNull FragmentManager fragmentManager, @MainMvp.NavigationType int type) { Fragment currentVisible = getVisibleFragment(fragmentManager); DeviceAppsView deviceAppsView = (DeviceAppsView) getFragmentByTag(fragmentManager, DeviceAppsView.TAG); FoldersView foldersView = (FoldersView) getFragmentByTag(fragmentManager, FoldersView.TAG); SelectedAppsView selectedAppsView = (SelectedAppsView) getFragmentByTag(fragmentManager, SelectedAppsView.TAG); switch (type) { case MainMvp.DEVICE_APPS: if (deviceAppsView == null) { onAddAndHide(fragmentManager, DeviceAppsView.newInstance(), currentVisible); } else { onShowHideFragment(fragmentManager, deviceAppsView, currentVisible); } break; case MainMvp.FOLDERS: if (foldersView == null) { onAddAndHide(fragmentManager, FoldersView.newInstance(), currentVisible); } else { onShowHideFragment(fragmentManager, foldersView, currentVisible); } break; case MainMvp.SELECTED_APPS: if (selectedAppsView == null) { onAddAndHide(fragmentManager, SelectedAppsView.newInstance(), currentVisible); } else { onShowHideFragment(fragmentManager, selectedAppsView, currentVisible); } break; } } @Override public void onShowHideFragment(@NonNull FragmentManager fragmentManager, @NonNull Fragment toShow, @NonNull Fragment toHide) { Logger.e("show", toShow.getClass().getSimpleName(), "hide", toHide.getClass().getSimpleName()); fragmentManager .beginTransaction() .hide(toHide) .show(toShow) .commit(); } @Override public void onAddAndHide(@NonNull FragmentManager fragmentManager, @NonNull Fragment toAdd, @NonNull Fragment toHide) { Logger.e("add", toAdd.getClass().getSimpleName(), "hide", toHide.getClass().getSimpleName()); fragmentManager .beginTransaction() .hide(toHide) .add(R.id.container, toAdd, toAdd.getClass().getSimpleName()) .commit(); } @Override public void onFilterResult(@NonNull FragmentManager supportFragmentManager, @Nullable String text) { Fragment fragment = getVisibleFragment(supportFragmentManager); Logger.e(fragment); if (fragment != null) { if (fragment instanceof DeviceAppsView) { ((DeviceAppsView) fragment).onFilter(text); } else if (fragment instanceof FoldersView) { ((FoldersView) fragment).onFilter(text); } else if (fragment instanceof SelectedAppsView) { ((SelectedAppsView) fragment).onFilter(text); } } } @Override public void onCreateNewFolder(@NonNull FragmentManager supportFragmentManager) { Fragment foldersView = getVisibleFragment(supportFragmentManager); if (!(foldersView instanceof FoldersView)) { throw new RuntimeException("Oops, Folders Fragment is not currently visible."); } ((FoldersView) foldersView).onCreateNewFolder(); } @Override public void onHandleShortcuts(@NonNull MainView mainView, @Nullable Intent intent) { if (intent != null && intent.getAction() != null) { String action = intent.getAction(); switch (action) { case "FOLDER_MODE": PrefHelper.set(PrefConstant.FLOATING_MODE, "Folders"); if (isAttached()) { getView().onStopService(); getView().onStartService(); } break; case "APPS_MODE": PrefHelper.set(PrefConstant.FLOATING_MODE, "Apps"); if (isAttached()) { getView().onStopService(); getView().onStartService(); } break; } } } @Override public void onBackupRestore(int backupType, @NonNull MainView mainView) { Intent intent = new Intent(mainView, LoginView.class); intent.putExtras(Bundler.start().put(LoginView.TYPE, backupType).end()); mainView.startActivity(intent); } @Override public void onShareUserBackup(@NonNull MainView mainView, @NonNull FirebaseUser currentUser) { String packageName = mainView.getApplicationContext().getPackageName(); Uri deepLinkBuilder = new Uri.Builder() .scheme("http") .authority(BuildConfig.FA_HOST) .appendQueryParameter(BuildConfig.SHARED_URI, currentUser.getUid()) .build(); Uri.Builder builder = new Uri.Builder() .scheme("https") .authority(mainView.getResources().getString(R.string.link_ref) + ".app.goo.gl") .path("/") .appendQueryParameter("link", Uri.parse(deepLinkBuilder.toString()).toString()) .appendQueryParameter("apn", packageName); ShareCompat.IntentBuilder.from(mainView) .setType("message/*") .setSubject(mainView.getString(R.string.sharing_backup)) .setChooserTitle(mainView.getString(R.string.share_my_backup)) .setHtmlText("<a href='" + Uri.decode(builder.toString()) + "'>" + mainView.getString(R.string.click_here_html) + "</a><br/><b>~" + mainView.getString(R.string.app_name) + "</b>").startChooser(); } @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { getView().onCloseDrawer(); switch (item.getItemId()) { case R.id.settings: getView().onOpenSettings(); return true; case R.id.start: getView().onStartService(); return true; case R.id.stop: getView().onStopService(); return true; case R.id.myApps: onMenuItemSelect(R.id.myApps, 0); return true; case R.id.folders: onMenuItemSelect(R.id.folders, 1); return true; case R.id.selectedApps: onMenuItemSelect(R.id.selectedApps, 2); return true; case R.id.backup: getView().onBackup(); break; case R.id.restore: getView().onRestore(); break; case R.id.shareBackup: getView().onShareBackup(); break; case R.id.rateUs: getView().onOpenRate(); break; } return false; } @Override public void onMenuItemSelect(@IdRes int id, int position) { if (isAttached()) { getView().onNavigationChanged(position); getView().onHideBadge(id); getView().onSelectMenuItem(id); } } @Override public void onMenuItemReselect(@IdRes int id, int position) {} @Override public void onResult(@NonNull AppInviteInvitationResult result) { if (result.getStatus().isSuccess()) { Intent intent = result.getInvitationIntent(); String deepLink = AppInviteReferral.getDeepLink(intent); Uri data = intent.getData(); String userId = data.getQueryParameter(BuildConfig.SHARED_URI); Logger.e(deepLink, data, userId); if (!InputHelper.isEmpty(userId)) { if (isAttached()) getView().onRestoreFromUserId(userId); } } else { Logger.e("no deep link found."); } } }