From ceef08db6ca984dc8f0982102afd732b2c0e12fe Mon Sep 17 00:00:00 2001 From: Thomas Date: Thu, 9 Jul 2020 17:57:01 +0200 Subject: [PATCH] Improve tablet 1 --- .../fedilab/fedilabtube/LoginActivity.java | 19 +++- .../app/fedilab/fedilabtube/MainActivity.java | 3 +- .../fedilab/fedilabtube/MyVideosActivity.java | 6 +- .../fedilabtube/drawer/PeertubeAdapter.java | 4 +- .../fragment/DisplayStatusFragment.java | 103 +++++++++++++++--- .../fedilab/fedilabtube/helper/Helper.java | 21 ++++ app/src/main/res/layout/drawer_peertube.xml | 1 + 7 files changed, 131 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/app/fedilab/fedilabtube/LoginActivity.java b/app/src/main/java/app/fedilab/fedilabtube/LoginActivity.java index 8a873d4..aef8d5b 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/LoginActivity.java +++ b/app/src/main/java/app/fedilab/fedilabtube/LoginActivity.java @@ -25,6 +25,7 @@ import android.text.style.ForegroundColorSpan; import android.text.style.UnderlineSpan; import android.view.MenuItem; import android.view.View; +import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; @@ -40,6 +41,8 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; +import com.google.android.material.textfield.TextInputLayout; + import org.jetbrains.annotations.NotNull; import org.json.JSONException; import org.json.JSONObject; @@ -124,10 +127,24 @@ public class LoginActivity extends AppCompatActivity implements OnRetrievePeertu login_uid = findViewById(R.id.login_uid); login_passwd = findViewById(R.id.login_passwd); + + if (Helper.isTablet(LoginActivity.this)) { + TextInputLayout login_uid_container = findViewById(R.id.login_uid_container); + ViewGroup.LayoutParams layoutParamsU = login_uid_container.getLayoutParams(); + layoutParamsU.width = (int) Helper.convertDpToPixel(300, LoginActivity.this); + login_uid_container.setLayoutParams(layoutParamsU); + + TextInputLayout login_passwd_container = findViewById(R.id.login_passwd_container); + ViewGroup.LayoutParams layoutParamsP = login_passwd_container.getLayoutParams(); + layoutParamsP.width = (int) Helper.convertDpToPixel(300, LoginActivity.this); + login_passwd_container.setLayoutParams(layoutParamsP); + } + + connectionButton = findViewById(R.id.login_button); login_uid.setOnFocusChangeListener((v, hasFocus) -> { - if( !hasFocus) { + if (!hasFocus) { if (android.util.Patterns.EMAIL_ADDRESS.matcher(login_uid.getText().toString().trim()).matches()) { String[] emailArray = login_uid.getText().toString().split("@"); if (emailArray.length > 1 && Arrays.asList(Helper.openid).contains(emailArray[1])) { diff --git a/app/src/main/java/app/fedilab/fedilabtube/MainActivity.java b/app/src/main/java/app/fedilab/fedilabtube/MainActivity.java index 42b8847..8a08fdb 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/MainActivity.java +++ b/app/src/main/java/app/fedilab/fedilabtube/MainActivity.java @@ -137,8 +137,7 @@ public class MainActivity extends AppCompatActivity { intent.putExtras(bundle); startActivity(intent); return true; - } - else if (item.getItemId() == R.id.action_playlist) { + } else if (item.getItemId() == R.id.action_playlist) { Intent intent = new Intent(MainActivity.this, AllPlaylistsActivity.class); startActivity(intent); return true; diff --git a/app/src/main/java/app/fedilab/fedilabtube/MyVideosActivity.java b/app/src/main/java/app/fedilab/fedilabtube/MyVideosActivity.java index 8ad2372..eda9919 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/MyVideosActivity.java +++ b/app/src/main/java/app/fedilab/fedilabtube/MyVideosActivity.java @@ -40,12 +40,12 @@ public class MyVideosActivity extends AppCompatActivity implements OnRetrieveFee getSupportActionBar().setDisplayHomeAsUpEnabled(true); Bundle b = getIntent().getExtras(); - if(b != null) + if (b != null) type = (RetrieveFeedsAsyncTask.Type) b.get("type"); - if( type == RetrieveFeedsAsyncTask.Type.MYVIDEOS) { + if (type == RetrieveFeedsAsyncTask.Type.MYVIDEOS) { setTitle(R.string.my_videos); - }else if (type == RetrieveFeedsAsyncTask.Type.PSUBSCRIPTIONS) { + } else if (type == RetrieveFeedsAsyncTask.Type.PSUBSCRIPTIONS) { setTitle(R.string.subscriptions); } diff --git a/app/src/main/java/app/fedilab/fedilabtube/drawer/PeertubeAdapter.java b/app/src/main/java/app/fedilab/fedilabtube/drawer/PeertubeAdapter.java index 35c3561..f65078b 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/drawer/PeertubeAdapter.java +++ b/app/src/main/java/app/fedilab/fedilabtube/drawer/PeertubeAdapter.java @@ -48,8 +48,6 @@ public class PeertubeAdapter extends RecyclerView.Adapter peertubes; private Context context; - private boolean ownVideos; - public PeertubeAdapter(List peertubes) { this.peertubes = peertubes; @@ -76,7 +74,7 @@ public class PeertubeAdapter extends RecyclerView.Adapter asyncTask; @@ -126,9 +129,17 @@ public class DisplayStatusFragment extends Fragment implements OnPostActionInter peertubeAdapater = new PeertubeAdapter(this.peertubes); lv_status.setAdapter(peertubeAdapater); - mLayoutManager = new LinearLayoutManager(context); - lv_status.setLayoutManager(mLayoutManager); + if (!Helper.isTablet(context)) { + mLayoutManager = new LinearLayoutManager(context); + lv_status.setLayoutManager(mLayoutManager); + } else { + gLayoutManager = new GridLayoutManager(context, 2); + int spanCount = (int) Helper.convertDpToPixel(2, context); + int spacing = (int) Helper.convertDpToPixel(5, context); + lv_status.addItemDecoration(new GridSpacingItemDecoration(spanCount, spacing, true)); + lv_status.setLayoutManager(gLayoutManager); + } swipeRefreshLayout.setOnRefreshListener(this::pullToRefresh); @@ -154,23 +165,43 @@ public class DisplayStatusFragment extends Fragment implements OnPostActionInter if (type != POVERVIEW) { lv_status.addOnScrollListener(new RecyclerView.OnScrollListener() { public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { - - int firstVisibleItem = mLayoutManager.findFirstVisibleItemPosition(); - if (dy > 0) { - int visibleItemCount = mLayoutManager.getChildCount(); - int totalItemCount = mLayoutManager.getItemCount(); - if (firstVisibleItem + visibleItemCount == totalItemCount && context != null) { - if (!flag_loading) { - flag_loading = true; - if (search_peertube == null) { //Not a Peertube search - asyncTask = new RetrieveFeedsAsyncTask(context, type, max_id, DisplayStatusFragment.this).execute(); - } else { - asyncTask = new RetrievePeertubeSearchAsyncTask(context, max_id, search_peertube, DisplayStatusFragment.this).execute(); + if (mLayoutManager != null) { + int firstVisibleItem = mLayoutManager.findFirstVisibleItemPosition(); + if (dy > 0) { + int visibleItemCount = mLayoutManager.getChildCount(); + int totalItemCount = mLayoutManager.getItemCount(); + if (firstVisibleItem + visibleItemCount == totalItemCount && context != null) { + if (!flag_loading) { + flag_loading = true; + if (search_peertube == null) { //Not a Peertube search + asyncTask = new RetrieveFeedsAsyncTask(context, type, max_id, DisplayStatusFragment.this).execute(); + } else { + asyncTask = new RetrievePeertubeSearchAsyncTask(context, max_id, search_peertube, DisplayStatusFragment.this).execute(); + } + nextElementLoader.setVisibility(View.VISIBLE); } - nextElementLoader.setVisibility(View.VISIBLE); + } else { + nextElementLoader.setVisibility(View.GONE); + } + } + } else if (gLayoutManager != null) { + int firstVisibleItem = gLayoutManager.findFirstVisibleItemPosition(); + if (dy > 0) { + int visibleItemCount = gLayoutManager.getChildCount(); + int totalItemCount = gLayoutManager.getItemCount(); + if (firstVisibleItem + visibleItemCount == totalItemCount && context != null) { + if (!flag_loading) { + flag_loading = true; + if (search_peertube == null) { //Not a Peertube search + asyncTask = new RetrieveFeedsAsyncTask(context, type, max_id, DisplayStatusFragment.this).execute(); + } else { + asyncTask = new RetrievePeertubeSearchAsyncTask(context, max_id, search_peertube, DisplayStatusFragment.this).execute(); + } + nextElementLoader.setVisibility(View.VISIBLE); + } + } else { + nextElementLoader.setVisibility(View.GONE); } - } else { - nextElementLoader.setVisibility(View.GONE); } } } @@ -289,6 +320,8 @@ public class DisplayStatusFragment extends Fragment implements OnPostActionInter public void scrollToTop() { if (mLayoutManager != null) { mLayoutManager.scrollToPositionWithOffset(0, 0); + } else if (gLayoutManager != null) { + gLayoutManager.scrollToPositionWithOffset(0, 0); } } @@ -313,4 +346,40 @@ public class DisplayStatusFragment extends Fragment implements OnPostActionInter public void onPostAction(int statusCode, PeertubeAPI.StatusAction statusAction, String userId, Error error) { } + + + static class GridSpacingItemDecoration extends RecyclerView.ItemDecoration { + + private int spanCount; + private int spacing; + private boolean includeEdge; + + public GridSpacingItemDecoration(int spanCount, int spacing, boolean includeEdge) { + this.spanCount = spanCount; + this.spacing = spacing; + this.includeEdge = includeEdge; + } + + @Override + public void getItemOffsets(@NotNull Rect outRect, @NotNull View view, RecyclerView parent, @NotNull RecyclerView.State state) { + int position = parent.getChildAdapterPosition(view); + int column = position % spanCount; + + if (includeEdge) { + outRect.left = spacing - column * spacing / spanCount; + outRect.right = (column + 1) * spacing / spanCount; + + if (position < spanCount) { + outRect.top = spacing; + } + outRect.bottom = spacing; + } else { + outRect.left = column * spacing / spanCount; + outRect.right = spacing - (column + 1) * spacing / spanCount; + if (position >= spanCount) { + outRect.top = spacing; + } + } + } + } } diff --git a/app/src/main/java/app/fedilab/fedilabtube/helper/Helper.java b/app/src/main/java/app/fedilab/fedilabtube/helper/Helper.java index a6bd055..027f32b 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/helper/Helper.java +++ b/app/src/main/java/app/fedilab/fedilabtube/helper/Helper.java @@ -20,6 +20,7 @@ import android.app.DownloadManager; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.content.res.Resources; import android.database.sqlite.SQLiteDatabase; import android.graphics.Bitmap; import android.graphics.Color; @@ -27,6 +28,7 @@ import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; +import android.util.DisplayMetrics; import android.util.TypedValue; import android.view.View; import android.view.WindowManager; @@ -645,4 +647,23 @@ public class Helper { return (prefKeyOauthTokenT != null); } + + /** + * Converts dp to pixel + * + * @param dp float - the value in dp to convert + * @param context Context + * @return float - the converted value in pixel + */ + public static float convertDpToPixel(float dp, Context context) { + Resources resources = context.getResources(); + DisplayMetrics metrics = resources.getDisplayMetrics(); + return dp * ((float) metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT); + } + + + public static boolean isTablet(Context context) { + return context.getResources().getBoolean(R.bool.is_tablet); + } + } diff --git a/app/src/main/res/layout/drawer_peertube.xml b/app/src/main/res/layout/drawer_peertube.xml index bc76454..67c195f 100644 --- a/app/src/main/res/layout/drawer_peertube.xml +++ b/app/src/main/res/layout/drawer_peertube.xml @@ -20,6 +20,7 @@ android:layout_height="wrap_content" android:divider="?android:dividerHorizontal" android:orientation="vertical" + android:gravity="bottom" android:showDividers="end">