package com.fastaccess.ui.modules.floating.folders.drawer; import android.annotation.SuppressLint; import android.content.Context; import android.content.res.Configuration; import android.graphics.Point; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.NinePatchDrawable; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.WindowManager; import com.fastaccess.R; import com.fastaccess.data.dao.AppsModel; import com.fastaccess.data.dao.FolderModel; import com.fastaccess.data.dao.events.ThemePackEventModel; import com.fastaccess.helper.Logger; import com.fastaccess.helper.ViewHelper; import com.fastaccess.provider.loader.SelectedAppsLoader; import com.fastaccess.ui.adapter.FloatingFolderAppsAdapter; import com.fastaccess.ui.adapter.viewholder.AppDrawerHolder; import com.fastaccess.ui.modules.floating.folders.FloatingFoldersMvp; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import java.util.ArrayList; import java.util.List; import static android.graphics.PixelFormat.TRANSLUCENT; import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; import static android.view.WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH; import static android.view.WindowManager.LayoutParams.TYPE_PRIORITY_PHONE; /** * Created by Kosh on 22 Oct 2016, 11:45 AM */ public class FloatingDrawerView implements FloatingDrawerMvp.View { private WindowManager.LayoutParams originalParams; private final FloatingFoldersMvp.View view; private AppDrawerHolder drawerHolder; private SelectedAppsLoader appsLoader; private FloatingFolderAppsAdapter adapter; private WindowManager windowManager; private FloatingDrawPresenter presenter; private boolean isFinishing; private FloatingDrawerView(@NonNull FloatingFoldersMvp.View view) { this.view = view; EventBus.getDefault().register(this); } public static FloatingDrawerView with(@NonNull FloatingFoldersMvp.View view) { return new FloatingDrawerView(view); } private void setupParams(@NonNull WindowManager windowManager) { this.windowManager = windowManager; originalParams = new WindowManager.LayoutParams(TYPE_PRIORITY_PHONE, FLAG_WATCH_OUTSIDE_TOUCH | FLAG_NOT_TOUCH_MODAL, TRANSLUCENT); Point szWindow = new Point(); windowManager.getDefaultDisplay().getSize(szWindow); updateParams(ViewHelper.isLandscape(drawerHolder.appDrawer.getResources()) ? 2 : 1, false); originalParams.gravity = Gravity.CENTER; windowManager.addView(drawerHolder.appDrawer, originalParams); drawerHolder.appDrawer.animate().scaleX(1f).scaleY(1f); } private void updateParams(int orientation, boolean update) { Point szWindow = new Point(); windowManager.getDefaultDisplay().getSize(szWindow); originalParams.width = orientation == Configuration.ORIENTATION_PORTRAIT ? szWindow.x - 50 : (szWindow.x - 150); originalParams.height = orientation == Configuration.ORIENTATION_PORTRAIT ? (int) (szWindow.y / 1.8) : (szWindow.y - 200); if (update) windowManager.updateViewLayout(drawerHolder.appDrawer, originalParams); } @SuppressLint("InflateParams") @Override public void onShow(@NonNull WindowManager windowManager, @NonNull View view, @NonNull FolderModel folder) { this.windowManager = windowManager; Context context = view.getContext(); drawerHolder = new AppDrawerHolder(LayoutInflater.from(view.getContext()).inflate(R.layout.floating_folder_layout, null, false), this); adapter = new FloatingFolderAppsAdapter(new ArrayList<AppsModel>(), getPresenter(), false); drawerHolder.recycler.setAdapter(adapter); drawerHolder.emptyText.setText(R.string.no_apps); drawerHolder.recycler.setEmptyView(drawerHolder.emptyText); drawerHolder.folderName.setText(folder.getFolderName()); NinePatchDrawable drawable = (NinePatchDrawable) drawerHolder.appDrawer.getBackground(); drawable.setColorFilter(new PorterDuffColorFilter(folder.getColor(), PorterDuff.Mode.MULTIPLY)); setupParams(windowManager); appsLoader = new SelectedAppsLoader(context, folder.getId()); appsLoader.registerListener(folder.hashCode(), getPresenter()); appsLoader.startLoading(); } @Override public void onAppsLoaded(@Nullable List<AppsModel> models) { if (models != null) adapter.insertItems(models); else adapter.clear(); } @Override public void onConfigChanged(int orientation) { updateParams(orientation, true); } @Override public void onTouchedOutside() { onDestroy(); } @Override public void onBackPressed() { onTouchedOutside(); } @Override public void onDestroy() { Logger.e(isFinishing); if (windowManager != null && !isFinishing) { if (drawerHolder != null && drawerHolder.appDrawer.isShown()) { drawerHolder.appDrawer.animate().alpha(0).scaleY(0).scaleX(0).withStartAction(startActionRunnable).withEndAction(endActionRunnable); } } } @SuppressWarnings("unused") @Subscribe public void onEvent(ThemePackEventModel model) { if (appsLoader != null) appsLoader.forceLoad(); } private FloatingDrawPresenter getPresenter() { if (presenter == null) { presenter = FloatingDrawPresenter.with(this); } return presenter; } private Runnable endActionRunnable = new Runnable() { @Override public void run() { drawerHolder.appDrawer.setVisibility(View.GONE); windowManager.removeView(drawerHolder.appDrawer); drawerHolder.onDestroy(); if (appsLoader != null) appsLoader.unregisterListener(getPresenter()); EventBus.getDefault().unregister(this); getPresenter().onDestroy(); } }; private Runnable startActionRunnable = new Runnable() { @Override public void run() { isFinishing = true;// prevent onTouchedOutside been called multiple times. } }; }