From fcf7ce6f319cdeb9e929f160ca3461d7dd68761b Mon Sep 17 00:00:00 2001 From: tom79 Date: Sat, 26 Aug 2017 19:39:11 +0200 Subject: [PATCH] special behavior for API < 21 --- .../activities/ShowAccountActivity.java | 53 +++++++++++++- .../fragments/DisplayAccountsFragment.java | 66 ++++++++++------- .../fragments/DisplayStatusFragment.java | 72 +++++++++++++------ 3 files changed, 143 insertions(+), 48 deletions(-) diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/activities/ShowAccountActivity.java b/app/src/main/java/fr/gouv/etalab/mastodon/activities/ShowAccountActivity.java index 332375b02..2975401f4 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/activities/ShowAccountActivity.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/activities/ShowAccountActivity.java @@ -15,7 +15,10 @@ package fr.gouv.etalab.mastodon.activities; import android.annotation.SuppressLint; +import android.content.BroadcastReceiver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.Canvas; @@ -29,6 +32,7 @@ import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; +import android.os.Handler; import android.support.annotation.RequiresApi; import android.support.design.widget.AppBarLayout; import android.support.design.widget.FloatingActionButton; @@ -37,6 +41,7 @@ import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.content.ContextCompat; +import android.support.v4.content.LocalBroadcastManager; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.app.ActionBar; @@ -114,6 +119,9 @@ public class ShowAccountActivity extends AppCompatActivity implements OnPostActi private Relationship relationship; private boolean showMediaOnly; private ImageView pp_actionBar; + private BroadcastReceiver hide_header; + private boolean isHiddingShowing = false; + private LinearLayout main_header_container; public enum action{ FOLLOW, @@ -140,7 +148,7 @@ public class ShowAccountActivity extends AppCompatActivity implements OnPostActi Bundle b = getIntent().getExtras(); account_follow = (FloatingActionButton) findViewById(R.id.account_follow); account_follow_request = (TextView) findViewById(R.id.account_follow_request); - + main_header_container = (LinearLayout) findViewById(R.id.main_header_container); account_follow.setEnabled(false); if(b != null){ accountId = b.getString("accountId"); @@ -253,6 +261,43 @@ public class ShowAccountActivity extends AppCompatActivity implements OnPostActi } } }); + + if( Build.VERSION.SDK_INT < 21) { + //Register LocalBroadcast to receive selected accounts after search + hide_header = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (!isHiddingShowing) { + isHiddingShowing = true; + ImageView account_pp = (ImageView) findViewById(R.id.account_pp); + boolean hide = intent.getBooleanExtra("hide", false); + if (hide) { + main_header_container.setVisibility(View.GONE); + if (pp_actionBar != null) + pp_actionBar.setVisibility(View.VISIBLE); + tabLayout.setVisibility(View.GONE); + } else { + manageButtonVisibility(); + tabLayout.setVisibility(View.VISIBLE); + main_header_container.setVisibility(View.VISIBLE); + if (pp_actionBar != null) + pp_actionBar.setVisibility(View.GONE); + } + account_pp.requestLayout(); + Handler handler = new Handler(); + handler.postDelayed(new Runnable() { + @Override + public void run() { + isHiddingShowing = false; + } + }, 700); + } + + } + }; + + LocalBroadcastManager.getInstance(this).registerReceiver(hide_header, new IntentFilter(Helper.HEADER_ACCOUNT + String.valueOf(instanceValue))); + } } @@ -299,6 +344,12 @@ public class ShowAccountActivity extends AppCompatActivity implements OnPostActi } } + @Override + public void onDestroy(){ + super.onDestroy(); + LocalBroadcastManager.getInstance(this).unregisterReceiver(hide_header); + } + @Override public void onRetrieveAccount(Account account, Error error) { if( error != null){ diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayAccountsFragment.java b/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayAccountsFragment.java index b8b6d13ca..3b0ee54ac 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayAccountsFragment.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayAccountsFragment.java @@ -17,9 +17,11 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.AsyncTask; +import android.os.Build; import android.os.Bundle; import android.os.Parcelable; import android.support.v4.app.Fragment; +import android.support.v4.content.LocalBroadcastManager; import android.support.v4.view.ViewCompat; import android.support.v4.widget.SwipeRefreshLayout; import android.view.LayoutInflater; @@ -62,6 +64,7 @@ public class DisplayAccountsFragment extends Fragment implements OnRetrieveAccou private boolean swiped; private ListView lv_accounts; private String instanceValue; + boolean hideHeader; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -70,7 +73,7 @@ public class DisplayAccountsFragment extends Fragment implements OnRetrieveAccou context = getContext(); boolean comesFromSearch = false; - boolean hideHeader = false; + hideHeader = false; Bundle bundle = this.getArguments(); accounts = new ArrayList<>(); if (bundle != null) { @@ -107,33 +110,48 @@ public class DisplayAccountsFragment extends Fragment implements OnRetrieveAccou if( !comesFromSearch) { //Hide account header when scrolling for ShowAccountActivity - if (hideHeader) { - ViewCompat.setNestedScrollingEnabled(lv_accounts,true); - }else{ - lv_accounts.setOnScrollListener(new AbsListView.OnScrollListener() { - @Override - public void onScrollStateChanged(AbsListView view, int scrollState) { + if (hideHeader && Build.VERSION.SDK_INT >= 21) + ViewCompat.setNestedScrollingEnabled(lv_accounts, true); + lv_accounts.setOnScrollListener(new AbsListView.OnScrollListener() { + int lastFirstVisibleItem = 0; + @Override + public void onScrollStateChanged(AbsListView view, int scrollState) { - } - - public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - - if (firstVisibleItem + visibleItemCount == totalItemCount) { - if (!flag_loading) { - flag_loading = true; - if (type != RetrieveAccountsAsyncTask.Type.FOLLOWERS && type != RetrieveAccountsAsyncTask.Type.FOLLOWING) - asyncTask = new RetrieveAccountsAsyncTask(context, type, max_id, DisplayAccountsFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - else - asyncTask = new RetrieveAccountsAsyncTask(context, type, targetedId, max_id, DisplayAccountsFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - nextElementLoader.setVisibility(View.VISIBLE); + } + public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { + if (hideHeader && Build.VERSION.SDK_INT < 21) { + if(firstVisibleItem == 0 && Helper.listIsAtTop(lv_accounts)){ + Intent intent = new Intent(Helper.HEADER_ACCOUNT+instanceValue); + intent.putExtra("hide", false); + LocalBroadcastManager.getInstance(context).sendBroadcast(intent); + }else if (view.getId() == lv_accounts.getId() && totalItemCount > visibleItemCount) { + final int currentFirstVisibleItem = lv_accounts.getFirstVisiblePosition(); + if (currentFirstVisibleItem > lastFirstVisibleItem) { + Intent intent = new Intent(Helper.HEADER_ACCOUNT + instanceValue); + intent.putExtra("hide", true); + LocalBroadcastManager.getInstance(context).sendBroadcast(intent); + } else if (currentFirstVisibleItem < lastFirstVisibleItem) { + Intent intent = new Intent(Helper.HEADER_ACCOUNT + instanceValue); + intent.putExtra("hide", false); + LocalBroadcastManager.getInstance(context).sendBroadcast(intent); } - } else { - nextElementLoader.setVisibility(View.GONE); + lastFirstVisibleItem = currentFirstVisibleItem; } } - }); - } - + if (firstVisibleItem + visibleItemCount == totalItemCount) { + if (!flag_loading) { + flag_loading = true; + if (type != RetrieveAccountsAsyncTask.Type.FOLLOWERS && type != RetrieveAccountsAsyncTask.Type.FOLLOWING) + asyncTask = new RetrieveAccountsAsyncTask(context, type, max_id, DisplayAccountsFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + else + asyncTask = new RetrieveAccountsAsyncTask(context, type, targetedId, max_id, DisplayAccountsFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + nextElementLoader.setVisibility(View.VISIBLE); + } + } else { + nextElementLoader.setVisibility(View.GONE); + } + } + }); swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayStatusFragment.java b/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayStatusFragment.java index 97a2f6a54..e08356a50 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayStatusFragment.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayStatusFragment.java @@ -14,12 +14,15 @@ package fr.gouv.etalab.mastodon.fragments; * You should have received a copy of the GNU General Public License along with Mastalab; if not, * see . */ import android.content.Context; +import android.content.Intent; import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.os.AsyncTask; +import android.os.Build; import android.os.Bundle; import android.os.Parcelable; import android.support.v4.app.Fragment; +import android.support.v4.content.LocalBroadcastManager; import android.support.v4.view.ViewCompat; import android.support.v4.widget.SwipeRefreshLayout; import android.view.LayoutInflater; @@ -76,6 +79,8 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn private TextView new_data; private int positionSpinnerTrans; private String since_id; + private boolean hideHeader; + private String instanceValue; public DisplayStatusFragment(){ displayStatusFragment = this; @@ -89,12 +94,13 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn context = getContext(); Bundle bundle = this.getArguments(); boolean comesFromSearch = false; - boolean hideHeader = false; + hideHeader = false; showMediaOnly = false; if (bundle != null) { type = (RetrieveFeedsAsyncTask.Type) bundle.get("type"); targetedId = bundle.getString("targetedId", null); tag = bundle.getString("tag", null); + instanceValue = bundle.getString("hideHeaderValue", null); hideHeader = bundle.getBoolean("hideHeader", false); showMediaOnly = bundle.getBoolean("showMediaOnly",false); if( bundle.containsKey("statuses")){ @@ -129,33 +135,53 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn if( !comesFromSearch){ //Hide account header when scrolling for ShowAccountActivity - if(hideHeader) { - ViewCompat.setNestedScrollingEnabled(lv_status,true); - }else{ - lv_status.setOnScrollListener(new AbsListView.OnScrollListener() { - @Override - public void onScrollStateChanged(AbsListView view, int scrollState) { + if (hideHeader && Build.VERSION.SDK_INT >= 21) + ViewCompat.setNestedScrollingEnabled(lv_status, true); - } - public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - if(firstVisibleItem + visibleItemCount == totalItemCount ) { - if(!flag_loading ) { - flag_loading = true; - if( type == RetrieveFeedsAsyncTask.Type.USER) - asyncTask = new RetrieveFeedsAsyncTask(context, type, targetedId, max_id, showMediaOnly, DisplayStatusFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - else if( type == RetrieveFeedsAsyncTask.Type.TAG) - asyncTask = new RetrieveFeedsAsyncTask(context, type, tag, targetedId, max_id, DisplayStatusFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - else - asyncTask = new RetrieveFeedsAsyncTask(context, type, max_id, DisplayStatusFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + lv_status.setOnScrollListener(new AbsListView.OnScrollListener() { + int lastFirstVisibleItem = 0; + @Override + public void onScrollStateChanged(AbsListView view, int scrollState) { - nextElementLoader.setVisibility(View.VISIBLE); + } + public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { + if (hideHeader && Build.VERSION.SDK_INT < 21) { + if(firstVisibleItem == 0 && Helper.listIsAtTop(lv_status)){ + Intent intent = new Intent(Helper.HEADER_ACCOUNT+instanceValue); + intent.putExtra("hide", false); + LocalBroadcastManager.getInstance(context).sendBroadcast(intent); + }else if (view.getId() == lv_status.getId() && totalItemCount > visibleItemCount) { + final int currentFirstVisibleItem = lv_status.getFirstVisiblePosition(); + if (currentFirstVisibleItem > lastFirstVisibleItem) { + Intent intent = new Intent(Helper.HEADER_ACCOUNT + instanceValue); + intent.putExtra("hide", true); + LocalBroadcastManager.getInstance(context).sendBroadcast(intent); + } else if (currentFirstVisibleItem < lastFirstVisibleItem) { + Intent intent = new Intent(Helper.HEADER_ACCOUNT + instanceValue); + intent.putExtra("hide", false); + LocalBroadcastManager.getInstance(context).sendBroadcast(intent); } - } else { - nextElementLoader.setVisibility(View.GONE); + lastFirstVisibleItem = currentFirstVisibleItem; } } - }); - } + if(firstVisibleItem + visibleItemCount == totalItemCount ) { + if(!flag_loading ) { + flag_loading = true; + if( type == RetrieveFeedsAsyncTask.Type.USER) + asyncTask = new RetrieveFeedsAsyncTask(context, type, targetedId, max_id, showMediaOnly, DisplayStatusFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + else if( type == RetrieveFeedsAsyncTask.Type.TAG) + asyncTask = new RetrieveFeedsAsyncTask(context, type, tag, targetedId, max_id, DisplayStatusFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + else + asyncTask = new RetrieveFeedsAsyncTask(context, type, max_id, DisplayStatusFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + + nextElementLoader.setVisibility(View.VISIBLE); + } + } else { + nextElementLoader.setVisibility(View.GONE); + } + } + }); + swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override