From 578abfd44ac3ab42b45a1c99d8414ca33dc6318c Mon Sep 17 00:00:00 2001 From: tom79 Date: Sat, 10 Jun 2017 16:01:10 +0200 Subject: [PATCH] Swipes left/right to change current timeline --- app/build.gradle | 4 +- .../mastodon/activities/MainActivity.java | 106 ++++++++++++++++-- .../activities/ShowAccountActivity.java | 2 +- .../mastodon/jobs/HomeTimelineSyncJob.java | 7 +- .../mastodon/jobs/NotificationsSyncJob.java | 10 +- app/src/main/res/anim/enter_from_left.xml | 8 ++ app/src/main/res/anim/enter_from_right.xml | 8 ++ app/src/main/res/anim/exit_to_left.xml | 8 ++ app/src/main/res/anim/exit_to_right.xml | 8 ++ app/src/main/res/layout/activity_main.xml | 1 + .../main/res/layout/activity_show_account.xml | 8 +- app/src/main/res/layout/drawer_account.xml | 3 + 12 files changed, 147 insertions(+), 26 deletions(-) create mode 100644 app/src/main/res/anim/enter_from_left.xml create mode 100644 app/src/main/res/anim/enter_from_right.xml create mode 100644 app/src/main/res/anim/exit_to_left.xml create mode 100644 app/src/main/res/anim/exit_to_right.xml diff --git a/app/build.gradle b/app/build.gradle index bf34f1edd..5308278b4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -26,5 +26,7 @@ dependencies { compile 'com.loopj.android:android-async-http:1.4.9' compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' compile 'com.evernote:android-job:1.1.10' - compile 'com.vdurmont:emoji-java:3.2.0' + compile ('com.vdurmont:emoji-java:3.2.0') { + exclude group: 'org.json' + } } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/activities/MainActivity.java b/app/src/main/java/fr/gouv/etalab/mastodon/activities/MainActivity.java index d9600424f..802207cc8 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/activities/MainActivity.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/activities/MainActivity.java @@ -24,6 +24,7 @@ import android.support.annotation.NonNull; import android.support.design.widget.FloatingActionButton; import android.support.v4.app.FragmentManager; import android.view.KeyEvent; +import android.view.MotionEvent; import android.view.View; import android.support.design.widget.NavigationView; import android.support.v4.view.GravityCompat; @@ -81,7 +82,15 @@ public class MainActivity extends AppCompatActivity private ImageLoader imageLoader; private DisplayImageOptions options; private View headerLayout; + static final int MIN_DISTANCE = 150; + private float downX, downY; + private int currentScreen = 1; + private actionSwipe currentAction; + private enum actionSwipe{ + RIGHT_TO_LEFT, + LEFT_TO_RIGHT + } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -407,18 +416,28 @@ public class MainActivity extends AppCompatActivity Bundle bundle = new Bundle(); FragmentManager fragmentManager = getSupportFragmentManager(); String fragmentTag = null; + currentScreen = -1; if (id == R.id.nav_home) { toot.setVisibility(View.VISIBLE); statusFragment = new DisplayStatusFragment(); bundle.putSerializable("type", RetrieveFeedsAsyncTask.Type.HOME); statusFragment.setArguments(bundle); fragmentTag = "HOME_TIMELINE"; - if(! first) - fragmentManager.beginTransaction() - .replace(R.id.main_app_container, statusFragment, fragmentTag).addToBackStack(fragmentTag).commit(); - else{ - fragmentManager.beginTransaction() + currentScreen = 1; + if(! first) { + if( currentAction == actionSwipe.LEFT_TO_RIGHT) + fragmentManager.beginTransaction().setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left, R.anim.enter_from_left, R.anim.exit_to_right) + .replace(R.id.main_app_container, statusFragment, fragmentTag).addToBackStack(fragmentTag).commit(); + else + fragmentManager.beginTransaction().setCustomAnimations(R.anim.enter_from_left, R.anim.exit_to_right, R.anim.enter_from_right, R.anim.exit_to_left) + .replace(R.id.main_app_container, statusFragment, fragmentTag).addToBackStack(fragmentTag).commit(); + }else{ + if( currentAction == actionSwipe.LEFT_TO_RIGHT) + fragmentManager.beginTransaction().setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left, R.anim.enter_from_left, R.anim.exit_to_right) .replace(R.id.main_app_container, statusFragment, fragmentTag).commit(); + else + fragmentManager.beginTransaction().setCustomAnimations(R.anim.enter_from_left, R.anim.exit_to_right, R.anim.enter_from_right, R.anim.exit_to_left) + .replace(R.id.main_app_container, statusFragment, fragmentTag).commit(); first = false; } } else if (id == R.id.nav_local) { @@ -427,8 +446,13 @@ public class MainActivity extends AppCompatActivity bundle.putSerializable("type", RetrieveFeedsAsyncTask.Type.LOCAL); statusFragment.setArguments(bundle); fragmentTag = "LOCAL_TIMELINE"; - fragmentManager.beginTransaction() + currentScreen = 2; + if( currentAction == actionSwipe.LEFT_TO_RIGHT) + fragmentManager.beginTransaction().setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left, R.anim.enter_from_left, R.anim.exit_to_right) .replace(R.id.main_app_container, statusFragment, fragmentTag).addToBackStack(fragmentTag).commit(); + else + fragmentManager.beginTransaction().setCustomAnimations(R.anim.enter_from_left, R.anim.exit_to_right, R.anim.enter_from_right, R.anim.exit_to_left) + .replace(R.id.main_app_container, statusFragment, fragmentTag).addToBackStack(fragmentTag).commit(); } else if (id == R.id.nav_global) { toot.setVisibility(View.VISIBLE); @@ -436,8 +460,13 @@ public class MainActivity extends AppCompatActivity bundle.putSerializable("type", RetrieveFeedsAsyncTask.Type.PUBLIC); statusFragment.setArguments(bundle); fragmentTag = "PUBLIC_TIMELINE"; - fragmentManager.beginTransaction() + currentScreen = 3; + if( currentAction == actionSwipe.LEFT_TO_RIGHT) + fragmentManager.beginTransaction().setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left, R.anim.enter_from_left, R.anim.exit_to_right) .replace(R.id.main_app_container, statusFragment, fragmentTag).addToBackStack(fragmentTag).commit(); + else + fragmentManager.beginTransaction().setCustomAnimations(R.anim.enter_from_left, R.anim.exit_to_right, R.anim.enter_from_right, R.anim.exit_to_left) + .replace(R.id.main_app_container, statusFragment, fragmentTag).addToBackStack(fragmentTag).commit(); } else if (id == R.id.nav_settings) { toot.setVisibility(View.GONE); TabLayoutSettingsFragment tabLayoutSettingsFragment= new TabLayoutSettingsFragment(); @@ -482,8 +511,6 @@ public class MainActivity extends AppCompatActivity fragmentManager.beginTransaction() .replace(R.id.main_app_container, followRequestSentFragment, fragmentTag).addToBackStack(fragmentTag).commit(); } - - setTitle(item.getTitle()); populateTitleWithTag(fragmentTag, item.getTitle().toString(), item.getItemId()); DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); @@ -523,4 +550,65 @@ public class MainActivity extends AppCompatActivity updateHeaderAccountInfo(MainActivity.this, account, headerLayout, imageLoader, options); } } + + @Override + public boolean dispatchTouchEvent(MotionEvent event) { + //Default dispatchTouchEvent is returned when not in communication page + if( currentScreen >3 || currentScreen < 1) + return super.dispatchTouchEvent(event); + switch(event.getAction()){ + case MotionEvent.ACTION_DOWN: { + downX = event.getX(); + downY = event.getY(); + return super.dispatchTouchEvent(event); + } + case MotionEvent.ACTION_UP: { + float upX = event.getX(); + float upY = event.getY(); + float deltaX = downX - upX; + float deltaY = downY - upY; + // swipe horizontal + if(Math.abs(deltaX) > MIN_DISTANCE && Math.abs(deltaY) < MIN_DISTANCE){ + if(deltaX < 0) { switchOnSwipe(actionSwipe.LEFT_TO_RIGHT); return true; } + if(deltaX > 0) { switchOnSwipe(actionSwipe.RIGHT_TO_LEFT); return true; } + } + } + } + return super.dispatchTouchEvent(event); + } + + + private void switchOnSwipe(actionSwipe action){ + currentScreen = (action == actionSwipe.LEFT_TO_RIGHT)?currentScreen-1:currentScreen+1; + if( currentScreen > 3 ) + currentScreen = 1; + if( currentScreen < 1) + currentScreen = 3; + currentAction = action; + final NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); + switch (currentScreen){ + case 1: + unCheckAllMenuItems(navigationView.getMenu()); + navigationView.getMenu().performIdentifierAction(R.id.nav_home, 0); + if( navigationView.getMenu().findItem(R.id.nav_home) != null) + navigationView.getMenu().findItem(R.id.nav_home).setChecked(true); + break; + case 2: + unCheckAllMenuItems(navigationView.getMenu()); + navigationView.getMenu().performIdentifierAction(R.id.nav_local, 0); + if( navigationView.getMenu().findItem(R.id.nav_local) != null) + navigationView.getMenu().findItem(R.id.nav_local).setChecked(true); + break; + case 3: + unCheckAllMenuItems(navigationView.getMenu()); + navigationView.getMenu().performIdentifierAction(R.id.nav_global, 0); + if( navigationView.getMenu().findItem(R.id.nav_global) != null) + navigationView.getMenu().findItem(R.id.nav_global).setChecked(true); + break; + default: + break; + } + } + + } 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 fbcf2cfb6..6ca201c5d 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 @@ -284,7 +284,7 @@ public class ShowAccountActivity extends AppCompatActivity implements OnPostActi if( account != null){ setTitle(account.getAcct()); account_dn.setText(EmojiParser.parseToUnicode(account.getDisplay_name())); - account_un.setText(account.getUsername()); + account_un.setText(String.format("@%s", account.getUsername())); if( account.getAcct() != null && account.getAcct().equals(account.getUsername())) account_ac.setVisibility(View.GONE); else diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/jobs/HomeTimelineSyncJob.java b/app/src/main/java/fr/gouv/etalab/mastodon/jobs/HomeTimelineSyncJob.java index b40d11066..f198424e5 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/jobs/HomeTimelineSyncJob.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/jobs/HomeTimelineSyncJob.java @@ -22,7 +22,6 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.support.annotation.NonNull; -import android.util.Log; import com.evernote.android.job.Job; import com.evernote.android.job.JobManager; @@ -62,8 +61,6 @@ import static fr.gouv.etalab.mastodon.helper.Helper.notify_user; public class HomeTimelineSyncJob extends Job implements OnRetrieveHomeTimelineServiceInterface{ static final String HOME_TIMELINE = "home_timeline"; - private int notificationId; - @NonNull @Override @@ -115,8 +112,6 @@ public class HomeTimelineSyncJob extends Job implements OnRetrieveHomeTimelineSe //Retrieve users in db that owner has. for (Account account: accounts) { String since_id = sharedpreferences.getString(Helper.LAST_HOMETIMELINE_MAX_ID + account.getId(), null); - long notif_id = Long.parseLong(account.getId()); - notificationId = ((notif_id + 2) > 2147483647 )?(int)(2147483647 - notif_id -2):(int)(notif_id + 2); new RetrieveHomeTimelineServiceAsyncTask(getContext(), account.getInstance(), account.getToken(), since_id, account.getAcct(), account.getId(), HomeTimelineSyncJob.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } @@ -171,6 +166,8 @@ public class HomeTimelineSyncJob extends Job implements OnRetrieveHomeTimelineSe intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK ); intent.putExtra(INTENT_ACTION, HOME_TIMELINE_INTENT); intent.putExtra(PREF_KEY_ID, userId); + long notif_id = Long.parseLong(userId); + int notificationId = ((notif_id + 2) > 2147483647) ? (int) (2147483647 - notif_id - 2) : (int) (notif_id + 2); if( max_id != null) notify_user(getContext(), intent, notificationId, icon_notification,title,message); SharedPreferences.Editor editor = sharedpreferences.edit(); diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/jobs/NotificationsSyncJob.java b/app/src/main/java/fr/gouv/etalab/mastodon/jobs/NotificationsSyncJob.java index 228a4fbec..fb97c1b49 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/jobs/NotificationsSyncJob.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/jobs/NotificationsSyncJob.java @@ -22,21 +22,16 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.support.annotation.NonNull; -import android.util.Log; - import com.evernote.android.job.Job; import com.evernote.android.job.JobManager; import com.evernote.android.job.JobRequest; import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; - - import java.io.File; import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; - import fr.gouv.etalab.mastodon.activities.MainActivity; import fr.gouv.etalab.mastodon.client.APIResponse; import fr.gouv.etalab.mastodon.client.PatchBaseImageDownloader; @@ -63,7 +58,6 @@ import static fr.gouv.etalab.mastodon.helper.Helper.notify_user; public class NotificationsSyncJob extends Job implements OnRetrieveNotificationsInterface{ static final String NOTIFICATION_REFRESH = "job_notification"; - private int notificationId; @NonNull @Override @@ -121,8 +115,6 @@ public class NotificationsSyncJob extends Job implements OnRetrieveNotifications //Retrieve users in db that owner has. for (Account account: accounts) { String max_id = sharedpreferences.getString(Helper.LAST_NOTIFICATION_MAX_ID + account.getId(), null); - long notif_id = Long.parseLong(account.getId()); - notificationId = ((notif_id + 1) > 2147483647 )?(int)(2147483647 - notif_id - 1):(int)(notif_id + 1); new RetrieveNotificationsAsyncTask(getContext(), account.getInstance(), account.getToken(), max_id, account.getAcct(), account.getId(), NotificationsSyncJob.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } } @@ -226,6 +218,8 @@ public class NotificationsSyncJob extends Job implements OnRetrieveNotifications intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK ); intent.putExtra(INTENT_ACTION, NOTIFICATION_INTENT); intent.putExtra(PREF_KEY_ID, userId); + long notif_id = Long.parseLong(userId); + int notificationId = ((notif_id + 1) > 2147483647) ? (int) (2147483647 - notif_id - 1) : (int) (notif_id + 1); if( max_id != null) notify_user(getContext(), intent, notificationId, icon_notification,title,message); } diff --git a/app/src/main/res/anim/enter_from_left.xml b/app/src/main/res/anim/enter_from_left.xml new file mode 100644 index 000000000..b4d93d925 --- /dev/null +++ b/app/src/main/res/anim/enter_from_left.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/enter_from_right.xml b/app/src/main/res/anim/enter_from_right.xml new file mode 100644 index 000000000..aaed2a84f --- /dev/null +++ b/app/src/main/res/anim/enter_from_right.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/exit_to_left.xml b/app/src/main/res/anim/exit_to_left.xml new file mode 100644 index 000000000..2533835ea --- /dev/null +++ b/app/src/main/res/anim/exit_to_left.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/exit_to_right.xml b/app/src/main/res/anim/exit_to_right.xml new file mode 100644 index 000000000..1d299d849 --- /dev/null +++ b/app/src/main/res/anim/exit_to_right.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 2a68dda80..8586083e9 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -44,6 +44,7 @@ + @@ -96,9 +100,8 @@ diff --git a/app/src/main/res/layout/drawer_account.xml b/app/src/main/res/layout/drawer_account.xml index a5d7d6df1..242e99112 100644 --- a/app/src/main/res/layout/drawer_account.xml +++ b/app/src/main/res/layout/drawer_account.xml @@ -72,12 +72,14 @@ android:orientation="horizontal">