diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/activities/MainActivity.java b/app/src/main/java/org/nuclearfog/twidda/ui/activities/MainActivity.java index 81c98e1e..0c437c3b 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/activities/MainActivity.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/activities/MainActivity.java @@ -36,7 +36,7 @@ import com.google.android.material.navigation.NavigationView.OnNavigationItemSel import com.squareup.picasso.Picasso; import org.nuclearfog.twidda.R; -import org.nuclearfog.twidda.backend.async.AsyncExecutor; +import org.nuclearfog.twidda.backend.async.AsyncExecutor.AsyncCallback; import org.nuclearfog.twidda.backend.async.UserLoader; import org.nuclearfog.twidda.backend.async.UserLoader.UserParam; import org.nuclearfog.twidda.backend.async.UserLoader.UserResult; @@ -57,7 +57,7 @@ import org.nuclearfog.twidda.ui.views.TabSelector.OnTabSelectedListener; * @author nuclearfog */ public class MainActivity extends AppCompatActivity implements ActivityResultCallback, OnTabSelectedListener, - OnQueryTextListener, OnNavigationItemSelectedListener, OnClickListener, AsyncExecutor.AsyncCallback { + OnQueryTextListener, OnNavigationItemSelectedListener, OnClickListener, AsyncCallback { public static final String KEY_SELECT_NOTIFICATION = "main_notification"; @@ -119,9 +119,15 @@ public class MainActivity extends AppCompatActivity implements ActivityResultCal picasso = PicassoBuilder.get(this); tabSelector.addViewPager(viewPager); viewPager.setOffscreenPageLimit(4); + if (navigationView.getLayoutParams() != null) { + navigationView.getLayoutParams().width = Math.round(getResources().getDisplayMetrics().widthPixels / 2.0f); + } if (!settings.floatingButtonEnabled()) { floatingButton.setVisibility(View.INVISIBLE); } + if (!settings.getLogin().getConfiguration().isFilterSupported()) { + navigationView.getMenu().findItem(R.id.menu_navigator_filter).setVisible(false); + } toolbar.setTitle(""); toolbar.setNavigationIcon(R.drawable.menu); @@ -378,6 +384,7 @@ public class MainActivity extends AppCompatActivity implements ActivityResultCal else intent.putExtra(ProfileActivity.KEY_ID, settings.getLogin().getId()); activityResultLauncher.launch(intent); + drawerLayout.close(); } else if (v.getId() == R.id.home_post) { Intent intent = new Intent(this, StatusEditor.class); startActivity(intent); diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/activities/ProfileActivity.java b/app/src/main/java/org/nuclearfog/twidda/ui/activities/ProfileActivity.java index 85b731b2..8f67dd54 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/activities/ProfileActivity.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/activities/ProfileActivity.java @@ -14,6 +14,7 @@ import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; +import android.view.ViewGroup; import android.view.ViewTreeObserver.OnPreDrawListener; import android.widget.Button; import android.widget.ImageView; @@ -65,8 +66,8 @@ import org.nuclearfog.twidda.model.User; import org.nuclearfog.twidda.ui.adapter.viewpager.ProfileAdapter; import org.nuclearfog.twidda.ui.dialogs.ConfirmDialog; import org.nuclearfog.twidda.ui.dialogs.ConfirmDialog.OnConfirmListener; -import org.nuclearfog.twidda.ui.views.LockableLinearLayout; -import org.nuclearfog.twidda.ui.views.LockableLinearLayout.LockCallback; +import org.nuclearfog.twidda.ui.views.LockableConstraintLayout; +import org.nuclearfog.twidda.ui.views.LockableConstraintLayout.LockCallback; import org.nuclearfog.twidda.ui.views.TabSelector; import org.nuclearfog.twidda.ui.views.TabSelector.OnTabSelectedListener; @@ -142,9 +143,9 @@ public class ProfileActivity extends AppCompatActivity implements OnScrollChange private UserLoader userLoader; private TextEmojiLoader emojiLoader; - private NestedScrollView root; + private NestedScrollView scroll; private ConstraintLayout header; - private LockableLinearLayout body; + private LockableConstraintLayout body; private TextView user_location, user_createdAt, user_website, description, follow_back, username, screenName; private ImageView profileImage, bannerImage, toolbarBackground; private Button following, follower; @@ -168,9 +169,11 @@ public class ProfileActivity extends AppCompatActivity implements OnScrollChange protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.page_profile); + ViewGroup root = findViewById(R.id.page_profile_root); + View floatingButton = findViewById(R.id.page_profile_post_button); header = findViewById(R.id.page_profile_header); body = findViewById(R.id.page_profile_body); - root = findViewById(R.id.user_view); + scroll = findViewById(R.id.page_profile_scroll); toolbar = findViewById(R.id.profile_toolbar); description = findViewById(R.id.bio); following = findViewById(R.id.following); @@ -201,6 +204,9 @@ public class ProfileActivity extends AppCompatActivity implements OnScrollChange constraints.connect(R.id.profile_banner, ConstraintSet.TOP, R.id.profile_toolbar, ConstraintSet.BOTTOM); constraints.applyTo(header); } + if (!settings.floatingButtonEnabled()) { + floatingButton.setVisibility(View.INVISIBLE); + } following.setCompoundDrawablesWithIntrinsicBounds(R.drawable.following, 0, 0, 0); follower.setCompoundDrawablesWithIntrinsicBounds(R.drawable.follower, 0, 0, 0); user_createdAt.setCompoundDrawablesWithIntrinsicBounds(R.drawable.date, 0, 0, 0); @@ -270,8 +276,9 @@ public class ProfileActivity extends AppCompatActivity implements OnScrollChange profileImage.setOnClickListener(this); bannerImage.setOnClickListener(this); user_website.setOnClickListener(this); - root.setOnScrollChangeListener(this); - root.getViewTreeObserver().addOnPreDrawListener(this); + floatingButton.setOnClickListener(this); + scroll.setOnScrollChangeListener(this); + scroll.getViewTreeObserver().addOnPreDrawListener(this); body.addLockCallback(this); } @@ -295,9 +302,9 @@ public class ProfileActivity extends AppCompatActivity implements OnScrollChange @Override public boolean onPreDraw() { - root.getViewTreeObserver().removeOnPreDrawListener(this); - body.getLayoutParams().height = root.getMeasuredHeight(); - root.scrollTo(0, 0); + scroll.getViewTreeObserver().removeOnPreDrawListener(this); + body.getLayoutParams().height = scroll.getMeasuredHeight(); + scroll.scrollTo(0, 0); return true; } @@ -555,6 +562,16 @@ public class ProfileActivity extends AppCompatActivity implements OnScrollChange startActivity(intent); } } + // open status editor + else if (v.getId() == R.id.page_profile_post_button) { + Intent intent = new Intent(this, StatusEditor.class); + if (user != null && !user.isCurrentUser()) { + // add username to status + String prefix = user.getScreenname() + " "; + intent.putExtra(StatusEditor.KEY_TEXT, prefix); + } + startActivity(intent); + } } @@ -600,7 +617,7 @@ public class ProfileActivity extends AppCompatActivity implements OnScrollChange @Override public boolean aquireLock() { - return root.getScrollY() < header.getMeasuredHeight() - SCROLL_THRESHOLD; + return scroll.getScrollY() < header.getMeasuredHeight() - SCROLL_THRESHOLD; } diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/activities/SearchActivity.java b/app/src/main/java/org/nuclearfog/twidda/ui/activities/SearchActivity.java index 4853ed88..45329ac5 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/activities/SearchActivity.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/activities/SearchActivity.java @@ -6,6 +6,8 @@ import android.graphics.Color; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; +import android.view.View; +import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Toast; @@ -37,7 +39,7 @@ import java.io.Serializable; * * @author nuclearfog */ -public class SearchActivity extends AppCompatActivity implements OnTabSelectedListener, OnQueryTextListener, AsyncCallback { +public class SearchActivity extends AppCompatActivity implements OnClickListener, OnTabSelectedListener, OnQueryTextListener, AsyncCallback { /** * Key for the search query, required @@ -79,6 +81,7 @@ public class SearchActivity extends AppCompatActivity implements OnTabSelectedLi setContentView(R.layout.page_search); ViewGroup root = findViewById(R.id.search_layout); TabSelector tabSelector = findViewById(R.id.search_tab); + View floatingButton = findViewById(R.id.search_post_button); toolbar = findViewById(R.id.search_toolbar); viewPager = findViewById(R.id.search_pager); @@ -97,6 +100,9 @@ public class SearchActivity extends AppCompatActivity implements OnTabSelectedLi hashtagAction.execute(param, this); } } + if (!settings.floatingButtonEnabled()) { + floatingButton.setVisibility(View.INVISIBLE); + } toolbar.setTitle(""); setSupportActionBar(toolbar); viewPager.setOffscreenPageLimit(3); @@ -107,6 +113,7 @@ public class SearchActivity extends AppCompatActivity implements OnTabSelectedLi AppStyles.setTheme(root); tabSelector.addOnTabSelectedListener(this); + floatingButton.setOnClickListener(this); } @@ -230,6 +237,17 @@ public class SearchActivity extends AppCompatActivity implements OnTabSelectedLi } + @Override + public void onClick(View v) { + if (v.getId() == R.id.search_post_button) { + Intent intent = new Intent(this, StatusEditor.class); + if (search.startsWith("#")) + intent.putExtra(StatusEditor.KEY_TEXT, search + " "); + startActivity(intent); + } + } + + @Override public void onTabSelected(int oldPosition) { invalidateOptionsMenu(); diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/views/LockableConstraintLayout.java b/app/src/main/java/org/nuclearfog/twidda/ui/views/LockableConstraintLayout.java index a9de809c..f00665b4 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/views/LockableConstraintLayout.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/views/LockableConstraintLayout.java @@ -16,8 +16,10 @@ public class LockableConstraintLayout extends ConstraintLayout { @Nullable private LockCallback callback; - private boolean lock = false; + private boolean xLock = false; + private boolean yLock = false; private float yPos = 0.0f; + private float xPos = 0.0f; /** * @inheritDoc @@ -37,20 +39,28 @@ public class LockableConstraintLayout extends ConstraintLayout { @Override public boolean onInterceptTouchEvent(MotionEvent ev) { switch (ev.getAction()) { + case MotionEvent.ACTION_MOVE: + float deltaX = ev.getX() - xPos; + float deltaY = ev.getY() - yPos; + // detect scroll down, then aquire scroll lock + if (!xLock && Math.abs(deltaY) > Math.abs(deltaX) * 3.0f) { + xLock = true; + } + if (xLock && deltaY < 0.0f && callback != null) { + yLock = callback.aquireLock(); + } + // fall through + case MotionEvent.ACTION_DOWN: + xPos = ev.getX(); yPos = ev.getY(); break; - case MotionEvent.ACTION_MOVE: - // detect scroll down, then aquire scroll lock - float deltaY = ev.getY() - yPos; - if (deltaY < 0.0f && callback != null) { - lock = callback.aquireLock(); - } - yPos = ev.getY(); + case MotionEvent.ACTION_UP: + xLock = false; break; } - return lock; + return yLock; } /** @@ -59,7 +69,7 @@ public class LockableConstraintLayout extends ConstraintLayout { * @param lock true to prevent child views to be scrolled */ public void lock(boolean lock) { - this.lock = lock; + this.yLock = lock; } /** diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/views/LockableLinearLayout.java b/app/src/main/java/org/nuclearfog/twidda/ui/views/LockableLinearLayout.java deleted file mode 100644 index 50c30646..00000000 --- a/app/src/main/java/org/nuclearfog/twidda/ui/views/LockableLinearLayout.java +++ /dev/null @@ -1,111 +0,0 @@ -package org.nuclearfog.twidda.ui.views; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.MotionEvent; -import android.widget.LinearLayout; - -import androidx.annotation.Nullable; - -/** - * Vertical {@link LinearLayout} implementation with child scroll lock - * - * @author nuclearfog - */ -public class LockableLinearLayout extends LinearLayout { - - /** - * minimum X-Y ratio of a swipe to determine if it's a left right swipe - */ - private static final float LEFT_RIGHT_SWIPE_RATIO = 2.0f; - - @Nullable - private LockCallback callback; - private boolean lock = false; - private float xPos = 0.0f; - private float yPos = 0.0f; - - /** - * @inheritDoc - */ - public LockableLinearLayout(Context context) { - this(context, null); - } - - /** - * @inheritDoc - */ - public LockableLinearLayout(Context context, @Nullable AttributeSet attrs) { - this(context, attrs, 0); - } - - /** - * @inheritDoc - */ - public LockableLinearLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { - this(context, attrs, defStyleAttr, 0); - } - - /** - * @inheritDoc - */ - public LockableLinearLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - setOrientation(VERTICAL); - } - - - @Override - public boolean onInterceptTouchEvent(MotionEvent ev) { - switch (ev.getAction()) { - case MotionEvent.ACTION_DOWN: - yPos = ev.getY(); - break; - - case MotionEvent.ACTION_MOVE: - float deltaX = ev.getX() - xPos; - float deltaY = ev.getY() - yPos; - // detect up/down swipe - if (deltaY < 0.0f && Math.abs(deltaX * LEFT_RIGHT_SWIPE_RATIO) < Math.abs(deltaY)) { - if (callback != null) { - lock = callback.aquireLock(); - } - } - // detect left/right swipe - else { - lock = false; - } - xPos = ev.getX(); - yPos = ev.getY(); - break; - } - return lock; - } - - /** - * lock/unlock child scrolling - * - * @param lock true to prevent child views to be scrolled - */ - public void lock(boolean lock) { - this.lock = lock; - } - - /** - * add callback to aquire child scroll lock - */ - public void addLockCallback(LockCallback callback) { - this.callback = callback; - } - - /** - * Callback to aquire child view scoll lock from activity - */ - public interface LockCallback { - - /** - * @return true to lock child scroll - */ - boolean aquireLock(); - } -} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_list.xml b/app/src/main/res/layout/fragment_list.xml index d0ca2236..e77c57a3 100644 --- a/app/src/main/res/layout/fragment_list.xml +++ b/app/src/main/res/layout/fragment_list.xml @@ -16,7 +16,8 @@ + android:layout_height="match_parent" + android:overScrollMode="never" /> diff --git a/app/src/main/res/layout/page_main.xml b/app/src/main/res/layout/page_main.xml index 325dff5d..849d9029 100644 --- a/app/src/main/res/layout/page_main.xml +++ b/app/src/main/res/layout/page_main.xml @@ -58,7 +58,6 @@ android:layout_height="match_parent" android:fitsSystemWindows="false" android:layout_gravity="start" - android:maxWidth="@dimen/mainpage_navigation_max_width" app:headerLayout="@layout/navigation_header" app:menu="@menu/main_navigation" /> diff --git a/app/src/main/res/layout/page_profile.xml b/app/src/main/res/layout/page_profile.xml index 08bd2ded..f49ff46b 100644 --- a/app/src/main/res/layout/page_profile.xml +++ b/app/src/main/res/layout/page_profile.xml @@ -1,241 +1,266 @@ - - + + + + + + + + + + + + + + + + + + + +