diff options
77 files changed, 3003 insertions, 1347 deletions
diff --git a/app/build.gradle b/app/build.gradle index b05c9891a..d586d9b30 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,8 +7,8 @@ android { applicationId "fr.gouv.etalab.mastodon" minSdkVersion 16 targetSdkVersion 28 - versionCode 204 - versionName "1.41.1" + versionCode 217 + versionName "1.62.0-beta-1" multiDexEnabled true } dexOptions { @@ -81,7 +81,7 @@ dependencies { implementation 'com.oguzdev:CircularFloatingActionMenu:1.0.2' implementation 'com.github.franmontiel:LocaleChanger:0.9.2' implementation 'com.github.stom79:SparkButton:1.0.10' - implementation 'com.github.GrenderG:Toasty:1.3.0' + implementation 'com.github.GrenderG:Toasty:1.3.1' implementation 'com.elconfidencial.bubbleshowcase:bubbleshowcase:1.3.1' implementation 'com.android.support:multidex:1.0.3' playstoreImplementation "io.github.kobakei:ratethisapp:$ratethisappLibraryVersion" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f34e05368..144a65db5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -42,6 +42,7 @@ <service android:name=".services.LiveNotificationService" android:exported="false"/> + <service android:name=".services.BackupStatusService" android:exported="false"/> <service android:name=".services.BackupStatusInDataBaseService" @@ -60,6 +61,9 @@ </intent-filter> </receiver> <service + android:name=".services.StreamingHomeTimelineService" + android:exported="false"/> + <service android:name=".services.StreamingFederatedTimelineService" android:exported="false"/> <service @@ -178,6 +182,11 @@ android:label="@string/app_name" android:launchMode="singleTask" /> + <activity android:name=".activities.LanguageActivity" + android:windowSoftInputMode="stateAlwaysHidden" + android:configChanges="orientation|screenSize" + android:label="@string/app_name" + /> <activity android:name=".activities.AboutActivity" android:windowSoftInputMode="stateAlwaysHidden" android:configChanges="orientation|screenSize" diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/activities/BaseMainActivity.java b/app/src/main/java/fr/gouv/etalab/mastodon/activities/BaseMainActivity.java index 1ff2dd7f2..229221bd8 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/activities/BaseMainActivity.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/activities/BaseMainActivity.java @@ -70,10 +70,10 @@ import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; -import android.widget.CheckBox; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; +import android.widget.RadioGroup; import android.widget.RelativeLayout; import android.widget.SeekBar; import android.widget.TextView; @@ -86,6 +86,7 @@ import org.json.JSONObject; import java.io.File; import java.lang.reflect.Method; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Locale; @@ -147,8 +148,7 @@ import fr.gouv.etalab.mastodon.sqlite.Sqlite; import static fr.gouv.etalab.mastodon.asynctasks.ManageFiltersAsyncTask.action.GET_ALL_FILTER; import static fr.gouv.etalab.mastodon.helper.Helper.ADD_USER_INTENT; import static fr.gouv.etalab.mastodon.helper.Helper.BACKUP_INTENT; -import static fr.gouv.etalab.mastodon.helper.Helper.CHANGE_THEME_INTENT; -import static fr.gouv.etalab.mastodon.helper.Helper.CHANGE_USER_INTENT; +import static fr.gouv.etalab.mastodon.helper.Helper.BACK_TO_SETTINGS; import static fr.gouv.etalab.mastodon.helper.Helper.EXTERNAL_STORAGE_REQUEST_CODE; import static fr.gouv.etalab.mastodon.helper.Helper.HOME_TIMELINE_INTENT; import static fr.gouv.etalab.mastodon.helper.Helper.INSTANCE_NAME; @@ -186,7 +186,7 @@ public abstract class BaseMainActivity extends BaseActivity private DisplayStatusFragment homeFragment, federatedFragment, localFragment, artFragment; private DisplayNotificationsFragment notificationsFragment; private static final int ERROR_DIALOG_REQUEST_CODE = 97; - private static BroadcastReceiver receive_data, receive_federated_data, receive_local_data; + private static BroadcastReceiver receive_data, receive_home_data, receive_federated_data, receive_local_data; private boolean display_direct, display_local, display_global, display_art; public static int countNewStatus = 0; public static int countNewNotifications = 0; @@ -195,7 +195,6 @@ public abstract class BaseMainActivity extends BaseActivity boolean notif_follow, notif_add, notif_mention, notif_share, show_boosts, show_replies , show_nsfw; String show_filtered; private AppBarLayout appBar; - private String bookmark; private String userId; private String instance; public int countPage; @@ -209,6 +208,7 @@ public abstract class BaseMainActivity extends BaseActivity private int style; private Activity activity; private HashMap<String, Integer> tabPosition = new HashMap<>(); + public static HashMap<Integer, RetrieveFeedsAsyncTask.Type> typePosition = new HashMap<>(); private FloatingActionButton federatedTimelines; @Override @@ -408,8 +408,10 @@ public abstract class BaseMainActivity extends BaseActivity if(remoteInstances != null) { SubMenu submMastodon = popup.getMenu().findItem(R.id.action_show_mastodon).getSubMenu(); SubMenu submPeertube = popup.getMenu().findItem(R.id.action_show_peertube).getSubMenu(); + SubMenu submPixelfed = popup.getMenu().findItem(R.id.action_show_pixelfed).getSubMenu(); + SubMenu submMisskey = popup.getMenu().findItem(R.id.action_show_misskey).getSubMenu(); SubMenu submChannel = popup.getMenu().findItem(R.id.action_show_channel).getSubMenu(); - int i = 0, j = 0 , k = 0; + int i = 0, j = 0 , k = 0, l = 0 , m = 0; for (RemoteInstance remoteInstance : remoteInstances) { if (remoteInstance.getType() == null || remoteInstance.getType().equals("MASTODON")) { MenuItem itemPlaceHolder = submMastodon.findItem(R.id.mastodon_instances); @@ -474,11 +476,73 @@ public abstract class BaseMainActivity extends BaseActivity }); k++; } + if (remoteInstance.getType() == null || remoteInstance.getType().equals("PIXELFED")) { + MenuItem itemPlaceHolder = submPixelfed.findItem(R.id.pixelfed_instance); + if( itemPlaceHolder != null) + itemPlaceHolder.setVisible(false); + MenuItem item = submPixelfed.add(0, j, Menu.NONE, remoteInstance.getHost()); + item.setIcon(R.drawable.pixelfed); + item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + DisplayStatusFragment statusFragment; + Bundle bundle = new Bundle(); + statusFragment = new DisplayStatusFragment(); + bundle.putSerializable("type", RetrieveFeedsAsyncTask.Type.PIXELFED); + bundle.putString("remote_instance", remoteInstance.getHost()); + statusFragment.setArguments(bundle); + String fragmentTag = "REMOTE_INSTANCE"; + instance_id = remoteInstance.getDbID(); + FragmentManager fragmentManager = getSupportFragmentManager(); + fragmentManager.beginTransaction() + .replace(R.id.main_app_container, statusFragment, fragmentTag).commit(); + main_app_container.setVisibility(View.VISIBLE); + viewPager.setVisibility(View.GONE); + tabLayout.setVisibility(View.GONE); + toolbarTitle.setVisibility(View.VISIBLE); + delete_instance.setVisibility(View.VISIBLE); + toolbarTitle.setText(remoteInstance.getHost()); + return false; + } + }); + j++; + } + if (remoteInstance.getType() == null || remoteInstance.getType().equals("MISSKEY")) { + MenuItem itemPlaceHolder = submPixelfed.findItem(R.id.misskey_instance); + if( itemPlaceHolder != null) + itemPlaceHolder.setVisible(false); + MenuItem item = submMisskey.add(0, l, Menu.NONE, remoteInstance.getHost()); + item.setIcon(R.drawable.misskey); + item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + DisplayStatusFragment statusFragment; + Bundle bundle = new Bundle(); + statusFragment = new DisplayStatusFragment(); + bundle.putSerializable("type", RetrieveFeedsAsyncTask.Type.REMOTE_INSTANCE); + bundle.putString("remote_instance", remoteInstance.getHost()); + statusFragment.setArguments(bundle); + String fragmentTag = "REMOTE_INSTANCE"; + instance_id = remoteInstance.getDbID(); + FragmentManager fragmentManager = getSupportFragmentManager(); + fragmentManager.beginTransaction() + .replace(R.id.main_app_container, statusFragment, fragmentTag).commit(); + main_app_container.setVisibility(View.VISIBLE); + viewPager.setVisibility(View.GONE); + tabLayout.setVisibility(View.GONE); + toolbarTitle.setVisibility(View.VISIBLE); + delete_instance.setVisibility(View.VISIBLE); + toolbarTitle.setText(remoteInstance.getHost()); + return false; + } + }); + l++; + } if (remoteInstance.getType() == null || remoteInstance.getType().equals("PEERTUBE")) { MenuItem itemPlaceHolder = submPeertube.findItem(R.id.peertube_instances); if( itemPlaceHolder != null) itemPlaceHolder.setVisible(false); - MenuItem item = submPeertube.add(0, j, Menu.NONE, remoteInstance.getHost()); + MenuItem item = submPeertube.add(0, m, Menu.NONE, remoteInstance.getHost()); item.setIcon(R.drawable.peertube_icon); item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override @@ -503,7 +567,7 @@ public abstract class BaseMainActivity extends BaseActivity return false; } }); - j++; + m++; } } } @@ -517,7 +581,9 @@ public abstract class BaseMainActivity extends BaseActivity dialogBuilder.setView(dialogView); AutoCompleteTextView instance_list = dialogView.findViewById(R.id.search_instance); - CheckBox peertube_instance = dialogView.findViewById(R.id.peertube_instance); + //Manage download of attachments + RadioGroup radioGroup = dialogView.findViewById(R.id.set_attachment_group); + instance_list.setFilters(new InputFilter[]{new InputFilter.LengthFilter(60)}); dialogBuilder.setPositiveButton(R.string.validate, new DialogInterface.OnClickListener() { @Override @@ -528,18 +594,27 @@ public abstract class BaseMainActivity extends BaseActivity @Override public void run() { try { - if( !peertube_instance.isChecked()) + if(radioGroup.getCheckedRadioButtonId() == R.id.mastodon_instance) new HttpsConnection(BaseMainActivity.this).get("https://" + instanceName + "/api/v1/timelines/public?local=true", 10, null, null); - else + else if( radioGroup.getCheckedRadioButtonId() == R.id.peertube_instance) new HttpsConnection(BaseMainActivity.this).get("https://" + instanceName + "/api/v1/videos/", 10, null, null); + else if( radioGroup.getCheckedRadioButtonId() == R.id.pixelfed_instance) { + new HttpsConnection(BaseMainActivity.this).get("https://" + instanceName + "/api/v1/timelines/public", 10, null, null); + }else if( radioGroup.getCheckedRadioButtonId() == R.id.misskey_instance) { + new HttpsConnection(BaseMainActivity.this).po |