Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5c72a0b8 authored by Amit Kumar's avatar Amit Kumar 💻
Browse files

Improve drag & drop behavior with a visible hot-zone

parent 87f3523d
Loading
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -77,7 +77,8 @@ android {


dependencies {
dependencies {
    implementation 'me.relex:circleindicator:1.2.2@aar'
    implementation 'me.relex:circleindicator:1.2.2@aar'
    implementation 'uk.co.chrisjenx:calligraphy:2.3.0'
    implementation 'io.github.inflationx:calligraphy3:3.1.1'
    implementation 'io.github.inflationx:viewpump:1.0.0'


    apiNougatImplementation 'org.cyanogenmod:platform.sdk:6.0'
    apiNougatImplementation 'org.cyanogenmod:platform.sdk:6.0'
    apiOreoImplementation files('libs/lineage-sdk.jar')
    apiOreoImplementation files('libs/lineage-sdk.jar')
+9 −4
Original line number Original line Diff line number Diff line
@@ -8,7 +8,9 @@ import foundation.e.blisslauncher.core.DeviceProfile;
import foundation.e.blisslauncher.core.IconsHandler;
import foundation.e.blisslauncher.core.IconsHandler;
import foundation.e.blisslauncher.core.customviews.WidgetHost;
import foundation.e.blisslauncher.core.customviews.WidgetHost;
import foundation.e.blisslauncher.features.launcher.AppProvider;
import foundation.e.blisslauncher.features.launcher.AppProvider;
import uk.co.chrisjenx.calligraphy.CalligraphyConfig;
import io.github.inflationx.calligraphy3.CalligraphyConfig;
import io.github.inflationx.calligraphy3.CalligraphyInterceptor;
import io.github.inflationx.viewpump.ViewPump;


public class BlissLauncher extends Application {
public class BlissLauncher extends Application {
    private IconsHandler iconsPackHandler;
    private IconsHandler iconsPackHandler;
@@ -25,9 +27,12 @@ public class BlissLauncher extends Application {
    public void onCreate() {
    public void onCreate() {
        super.onCreate();
        super.onCreate();


        CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
        ViewPump.init(ViewPump.builder()
                .addInterceptor(new CalligraphyInterceptor(
                        new CalligraphyConfig.Builder()
                                .setDefaultFontPath("Roboto-Regular.ttf")
                                .setDefaultFontPath("Roboto-Regular.ttf")
                                .setFontAttrId(R.attr.fontPath)
                                .setFontAttrId(R.attr.fontPath)
                                .build()))
                .build());
                .build());


        sAppWidgetManager = AppWidgetManager.getInstance(getApplicationContext());
        sAppWidgetManager = AppWidgetManager.getInstance(getApplicationContext());
+82 −42
Original line number Original line Diff line number Diff line
package foundation.e.blisslauncher.features.launcher;
package foundation.e.blisslauncher.features.launcher;


import static android.view.View.GONE;
import static android.view.View.VISIBLE;

import android.Manifest;
import android.Manifest;
import android.animation.Animator;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorListenerAdapter;
@@ -139,6 +136,7 @@ import foundation.e.blisslauncher.features.weather.WeatherUtils;
import foundation.e.blisslauncher.features.widgets.WidgetManager;
import foundation.e.blisslauncher.features.widgets.WidgetManager;
import foundation.e.blisslauncher.features.widgets.WidgetViewBuilder;
import foundation.e.blisslauncher.features.widgets.WidgetViewBuilder;
import foundation.e.blisslauncher.features.widgets.WidgetsActivity;
import foundation.e.blisslauncher.features.widgets.WidgetsActivity;
import io.github.inflationx.viewpump.ViewPumpContextWrapper;
import io.reactivex.Observable;
import io.reactivex.Observable;
import io.reactivex.ObservableSource;
import io.reactivex.ObservableSource;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.android.schedulers.AndroidSchedulers;
@@ -146,7 +144,9 @@ import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.observers.DisposableObserver;
import io.reactivex.observers.DisposableObserver;
import io.reactivex.schedulers.Schedulers;
import io.reactivex.schedulers.Schedulers;
import me.relex.circleindicator.CircleIndicator;
import me.relex.circleindicator.CircleIndicator;
import uk.co.chrisjenx.calligraphy.CalligraphyContextWrapper;

import static android.view.View.GONE;
import static android.view.View.VISIBLE;


public class LauncherActivity extends AppCompatActivity implements
public class LauncherActivity extends AppCompatActivity implements
        AutoCompleteAdapter.OnSuggestionClickListener, OnSwipeDownListener {
        AutoCompleteAdapter.OnSuggestionClickListener, OnSwipeDownListener {
@@ -200,6 +200,8 @@ public class LauncherActivity extends AppCompatActivity implements
    private FrameLayout swipeSearchContainer;
    private FrameLayout swipeSearchContainer;
    private RelativeLayout workspace;
    private RelativeLayout workspace;
    private View backgroundLayer;
    private View backgroundLayer;
    private View scrollCornerRight;
    private View scrollCornerLeft;


    private BroadcastReceiver mWeatherReceiver = new BroadcastReceiver() {
    private BroadcastReceiver mWeatherReceiver = new BroadcastReceiver() {
        @Override
        @Override
@@ -293,6 +295,8 @@ public class LauncherActivity extends AppCompatActivity implements
        workspace = mLauncherView.findViewById(R.id.workspace);
        workspace = mLauncherView.findViewById(R.id.workspace);
        mHorizontalPager = mLauncherView.findViewById(R.id.pages_container);
        mHorizontalPager = mLauncherView.findViewById(R.id.pages_container);
        backgroundLayer = mLauncherView.findViewById(R.id.background_layer);
        backgroundLayer = mLauncherView.findViewById(R.id.background_layer);
        scrollCornerLeft = mLauncherView.findViewById(R.id.scroll_corner_left);
        scrollCornerRight = mLauncherView.findViewById(R.id.scroll_corner_right);
        statusBarHeight = 0;
        statusBarHeight = 0;
        int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
        int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
        if (resourceId > 0) {
@@ -310,6 +314,11 @@ public class LauncherActivity extends AppCompatActivity implements
        maxDistanceForFolderCreation = (int) (0.45f * mDeviceProfile.iconSizePx);
        maxDistanceForFolderCreation = (int) (0.45f * mDeviceProfile.iconSizePx);


        scrollCorner = mDeviceProfile.iconDrawablePaddingPx / 2;
        scrollCorner = mDeviceProfile.iconDrawablePaddingPx / 2;
        scrollCornerLeft.getLayoutParams().width = scrollCorner;
        ((RelativeLayout.LayoutParams) scrollCornerLeft.getLayoutParams()).topMargin = (int) (statusBarHeight + Utilities.pxFromDp(8, this));
        scrollCornerRight.getLayoutParams().width = scrollCorner;
        ((RelativeLayout.LayoutParams) scrollCornerRight.getLayoutParams()).topMargin = (int) (statusBarHeight + Utilities.pxFromDp(8, this));

        wobbleAnimation = AnimationUtils.loadAnimation(this, R.anim.wobble);
        wobbleAnimation = AnimationUtils.loadAnimation(this, R.anim.wobble);
        wobbleReverseAnimation = AnimationUtils.loadAnimation(this, R.anim.wobble_reverse);
        wobbleReverseAnimation = AnimationUtils.loadAnimation(this, R.anim.wobble_reverse);
        getWindow().getDecorView().setSystemUiVisibility(
        getWindow().getDecorView().setSystemUiVisibility(
@@ -356,7 +365,7 @@ public class LauncherActivity extends AppCompatActivity implements
    }
    }


    protected void attachBaseContext(Context context) {
    protected void attachBaseContext(Context context) {
        super.attachBaseContext(CalligraphyContextWrapper.wrap(context));
        super.attachBaseContext(ViewPumpContextWrapper.wrap(context));
    }
    }


    public CompositeDisposable getCompositeDisposable() {
    public CompositeDisposable getCompositeDisposable() {
@@ -2106,6 +2115,20 @@ public class LauncherActivity extends AppCompatActivity implements
                    if (mWobblingCountDownTimer != null) {
                    if (mWobblingCountDownTimer != null) {
                        mWobblingCountDownTimer.cancel();
                        mWobblingCountDownTimer.cancel();
                    }
                    }
                    AnimatorSet animatorSet = new AnimatorSet();
                    animatorSet.play(ObjectAnimator.ofFloat(scrollCornerLeft, View.ALPHA, 1f))
                            .with(ObjectAnimator.ofFloat(scrollCornerRight, View.ALPHA, 1f));
                    animatorSet.setDuration(100);
                    animatorSet.addListener(new AnimatorListenerAdapter() {

                        @Override
                        public void onAnimationStart(Animator animation) {
                            super.onAnimationStart(animation);
                            scrollCornerRight.setVisibility(VISIBLE);
                            scrollCornerLeft.setVisibility(VISIBLE);
                        }
                    });
                    animatorSet.start();
                } else if (dragEvent.getAction() == DragEvent.ACTION_DRAG_LOCATION) {
                } else if (dragEvent.getAction() == DragEvent.ACTION_DRAG_LOCATION) {
                    cX = dragEvent.getX() - dragShadowBuilder.xOffset;
                    cX = dragEvent.getX() - dragShadowBuilder.xOffset;
                    cY = mHorizontalPager.getY() + dragEvent.getY()
                    cY = mHorizontalPager.getY() + dragEvent.getY()
@@ -2123,11 +2146,41 @@ public class LauncherActivity extends AppCompatActivity implements
                        return true;
                        return true;
                    }
                    }



                    GridLayout page = pages.get(getCurrentAppsPageNumber());
                    GridLayout page = pages.get(getCurrentAppsPageNumber());


                    if (cX < mDeviceProfile.availableWidthPx - scrollCorner
                    if ((cX - mDeviceProfile.iconSizePx / 10) > mDeviceProfile.availableWidthPx - 2 * scrollCorner) {
                            && cX > scrollCorner) {
                        if (getCurrentAppsPageNumber() + 1 < pages.size()) {
                            mHorizontalPager.scrollRight(300);
                        } else if (getCurrentAppsPageNumber() + 1 == pages.size()
                                && getGridFromPage(page).getChildCount() > 1) {
                            GridLayout layout = preparePage();
                            pages.add(layout);
                            ImageView dot = new ImageView(LauncherActivity.this);
                            dot.setImageDrawable(getDrawable(R.drawable.dot_off));
                            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                                    getResources().getDimensionPixelSize(
                                            R.dimen.dotSize),
                                    getResources().getDimensionPixelSize(
                                            R.dimen.dotSize)
                            );
                            dot.setLayoutParams(params);
                            mIndicator.addView(dot);
                            mHorizontalPager.addView(layout);
                        }
                    } else if ((cX + mDeviceProfile.iconSizePx / 10) < 2 * scrollCorner) {
                        if (getCurrentAppsPageNumber() == 0) {
                            return true;
                        }
                        if (getCurrentAppsPageNumber() - 1 >= 0) {
                            mHorizontalPager.scrollLeft(300);
                        } else if (getCurrentAppsPageNumber() + 1 == pages.size() - 2
                                && getGridFromPage(pages.get(pages.size() - 1)).getChildCount()
                                <= 0) {
                            mIndicator.removeViewAt(pages.size());
                            mHorizontalPager.removeViewAt(pages.size());
                            pages.remove(pages.size() - 1);
                        }
                    } else {


                        int index = getIndex(page, cX, cY);
                        int index = getIndex(page, cX, cY);
                        // If hovering over self, ignore drag/drop
                        // If hovering over self, ignore drag/drop
@@ -2184,40 +2237,6 @@ public class LauncherActivity extends AppCompatActivity implements
                            mReorderAlarm.setOnAlarmListener(reorderAlarmListener);
                            mReorderAlarm.setOnAlarmListener(reorderAlarmListener);
                            mReorderAlarm.setAlarm(REORDER_TIMEOUT);
                            mReorderAlarm.setAlarm(REORDER_TIMEOUT);
                        }
                        }
                    } else {
                        if (cX > mDeviceProfile.availableWidthPx - scrollCorner) {
                            if (getCurrentAppsPageNumber() + 1 < pages.size()) {
                                mHorizontalPager.scrollRight(300);
                            } else if (getCurrentAppsPageNumber() + 1 == pages.size()
                                    && getGridFromPage(page).getChildCount() > 1) {
                                GridLayout layout = preparePage();
                                pages.add(layout);
                                ImageView dot = new ImageView(LauncherActivity.this);
                                dot.setImageDrawable(getDrawable(R.drawable.dot_off));
                                LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                                        getResources().getDimensionPixelSize(
                                                R.dimen.dotSize),
                                        getResources().getDimensionPixelSize(
                                                R.dimen.dotSize)
                                );
                                dot.setLayoutParams(params);
                                mIndicator.addView(dot);
                                mHorizontalPager.addView(layout);
                            }
                        } else if (cX < scrollCorner) {
                            if (getCurrentAppsPageNumber() == 0) {
                                return true;
                            }
                            if (getCurrentAppsPageNumber() - 1 >= 0) {
                                mHorizontalPager.scrollLeft(300);
                            } else if (getCurrentAppsPageNumber() + 1 == pages.size() - 2
                                    && getGridFromPage(pages.get(pages.size() - 1)).getChildCount()
                                    <= 0) {
                                mIndicator.removeViewAt(pages.size());
                                mHorizontalPager.removeViewAt(pages.size());
                                pages.remove(pages.size() - 1);
                            }
                        }
                    }
                    }
                } else if (dragEvent.getAction() == DragEvent.ACTION_DROP) {
                } else if (dragEvent.getAction() == DragEvent.ACTION_DROP) {
                    cleanupReorder(true);
                    cleanupReorder(true);
@@ -2272,6 +2291,27 @@ public class LauncherActivity extends AppCompatActivity implements
                        isDragging = false;
                        isDragging = false;
                    }
                    }


                    AnimatorSet animatorSet = new AnimatorSet();
                    animatorSet.play(ObjectAnimator.ofFloat(scrollCornerLeft, View.ALPHA, 0f))
                            .with(ObjectAnimator.ofFloat(scrollCornerRight, View.ALPHA, 0f));
                    animatorSet.setDuration(100);
                    animatorSet.addListener(new AnimatorListenerAdapter() {
                        @Override
                        public void onAnimationCancel(Animator animation) {
                            super.onAnimationCancel(animation);
                            scrollCornerRight.setVisibility(GONE);
                            scrollCornerLeft.setVisibility(GONE);
                        }

                        @Override
                        public void onAnimationEnd(Animator animation) {
                            super.onAnimationEnd(animation);
                            scrollCornerRight.setVisibility(GONE);
                            scrollCornerLeft.setVisibility(GONE);
                        }
                    });
                    animatorSet.start();

                    if (movingApp.getVisibility() != VISIBLE) {
                    if (movingApp.getVisibility() != VISIBLE) {
                        movingApp.setVisibility(View.VISIBLE);
                        movingApp.setVisibility(View.VISIBLE);
                    }
                    }
+20 −0
Original line number Original line Diff line number Diff line
@@ -14,6 +14,26 @@
        android:alpha="0"
        android:alpha="0"
        android:background="@color/dark_grey_44" />
        android:background="@color/dark_grey_44" />


    <View
        android:id="@+id/scroll_corner_left"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_above="@+id/dock"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:background="#88FFFFFF"
        android:visibility="gone"/>

    <View
        android:id="@+id/scroll_corner_right"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_above="@+id/dock"
        android:layout_alignParentTop="true"
        android:layout_alignParentEnd="true"
        android:background="#88FFFFFF"
        android:visibility="gone"/>

    <foundation.e.blisslauncher.core.customviews.HorizontalPager
    <foundation.e.blisslauncher.core.customviews.HorizontalPager
        android:id="@+id/pages_container"
        android:id="@+id/pages_container"
        android:layout_width="match_parent"
        android:layout_width="match_parent"