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">