From 5db8bfd0b3d5a1f975b5f57e576847fb5a28ee2b Mon Sep 17 00:00:00 2001 From: Thomas Date: Sun, 12 Jun 2022 11:28:13 +0200 Subject: [PATCH] Add partnership and prepare beta 21 --- app/build.gradle | 13 +- app/src/main/AndroidManifest.xml | 6 + .../app/fedilab/android/BaseMainActivity.java | 4 + .../android/activities/AboutActivity.java | 3 +- .../activities/PartnerShipActivity.java | 139 ++++++++++++++++++ .../android/activities/ProfileActivity.java | 17 +-- .../app/fedilab/android/helper/Helper.java | 25 ++++ .../android/helper/PinnedTimelineHelper.java | 11 +- .../android/helper/SpannableHelper.java | 2 +- .../fedilab/android/helper/ThemeHelper.java | 18 +++ .../timeline/FragmentMastodonTimeline.java | 5 +- .../ic_baseline_account_circle_24.xml | 10 ++ app/src/main/res/drawable/mastohost.png | Bin 0 -> 10009 bytes app/src/main/res/layout/activity_about.xml | 15 +- .../main/res/layout/activity_partnership.xml | 111 ++++++++++++++ .../main/res/menu/activity_main_drawer.xml | 5 + app/src/main/res/values/strings.xml | 2 +- 17 files changed, 349 insertions(+), 37 deletions(-) create mode 100644 app/src/main/java/app/fedilab/android/activities/PartnerShipActivity.java create mode 100644 app/src/main/res/drawable/ic_baseline_account_circle_24.xml create mode 100644 app/src/main/res/drawable/mastohost.png create mode 100644 app/src/main/res/layout/activity_partnership.xml diff --git a/app/build.gradle b/app/build.gradle index f539362a..f30ea1d6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,9 +9,8 @@ android { defaultConfig { minSdk 21 targetSdk 31 - versionCode 21 - versionName "beta-21" - + versionCode 385 + versionName "3.0.0-beta-22" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } flavorDimensions "default" @@ -27,13 +26,13 @@ android { } productFlavors { fdroid { - applicationId "fr.gouv.etalab.mastodon.test" + applicationId "fr.gouv.etalab.mastodon" buildConfigField "boolean", "DONATIONS", "true" buildConfigField "boolean", "push", "false" flavor = "fdroid" } playstore { - applicationId "app.fedilab.android.test" + applicationId "app.fedilab.android" buildConfigField "boolean", "DONATIONS", "false" buildConfigField "boolean", "push", "true" flavor = "playstore" @@ -98,8 +97,8 @@ dependencies { implementation project(path: ':cropper') annotationProcessor "com.github.bumptech.glide:compiler:4.12.0" implementation 'jp.wasabeef:glide-transformations:4.3.0' - implementation 'com.github.penfeizhou.android.animation:apng:2.17.0' - implementation 'com.github.penfeizhou.android.animation:gif:2.17.0' + implementation 'com.github.penfeizhou.android.animation:apng:2.22.0' + implementation 'com.github.penfeizhou.android.animation:gif:2.22.0' implementation 'com.google.android.exoplayer:exoplayer:2.16.1' implementation 'com.github.piasy:rxandroidaudio:1.7.0' implementation 'com.github.piasy:AudioProcessor:1.7.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 40873aea..4f6b36d7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -108,6 +108,12 @@ android:configChanges="keyboardHidden|orientation|screenSize" android:label="@string/action_about" android:theme="@style/AppThemeBar" /> + + Helper.openBrowser(AboutActivity.this, "https://www.paypal.me/Mastalab")); - + binding.accountFollow.setBackgroundTintList(ThemeHelper.getButtonActionColorStateList(AboutActivity.this)); if (BuildConfig.DONATIONS) { binding.aboutSupportPaypal.setVisibility(View.VISIBLE); } else { binding.aboutSupportPaypal.setVisibility(View.GONE); } + binding.accountFollow.setImageResource(R.drawable.ic_baseline_person_add_24); binding.aboutWebsite.setOnClickListener(v -> Helper.openBrowser(AboutActivity.this, "https://fedilab.app")); CrossActionHelper.fetchRemoteAccount(AboutActivity.this, "@apps@toot.fedilab.app", new CrossActionHelper.Callback() { @Override diff --git a/app/src/main/java/app/fedilab/android/activities/PartnerShipActivity.java b/app/src/main/java/app/fedilab/android/activities/PartnerShipActivity.java new file mode 100644 index 00000000..3e17e678 --- /dev/null +++ b/app/src/main/java/app/fedilab/android/activities/PartnerShipActivity.java @@ -0,0 +1,139 @@ +package app.fedilab.android.activities; +/* Copyright 2022 Thomas Schneider + * + * This file is a part of Fedilab + * + * This program is free software; you can redistribute it and/or modify it under the terms of the + * GNU General Public License as published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * Fedilab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with Fedilab; if not, + * see . */ + + +import android.content.Intent; +import android.graphics.drawable.ColorDrawable; +import android.net.Uri; +import android.os.Bundle; +import android.text.method.LinkMovementMethod; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.appcompat.app.ActionBar; +import androidx.core.app.ActivityOptionsCompat; +import androidx.core.content.ContextCompat; +import androidx.lifecycle.ViewModelProvider; + +import java.util.ArrayList; +import java.util.List; + +import app.fedilab.android.R; +import app.fedilab.android.client.entities.api.Account; +import app.fedilab.android.client.entities.api.Status; +import app.fedilab.android.databinding.ActivityPartnershipBinding; +import app.fedilab.android.helper.CrossActionHelper; +import app.fedilab.android.helper.Helper; +import app.fedilab.android.helper.MastodonHelper; +import app.fedilab.android.helper.ThemeHelper; +import app.fedilab.android.viewmodel.mastodon.AccountsVM; + + +public class PartnerShipActivity extends BaseActivity { + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + ThemeHelper.applyThemeBar(this); + ActivityPartnershipBinding binding = ActivityPartnershipBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + if (getSupportActionBar() != null) { + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setBackgroundDrawable(new ColorDrawable(ContextCompat.getColor(this, R.color.cyanea_primary))); + } + + + ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE); + assert inflater != null; + View view = inflater.inflate(R.layout.simple_bar, new LinearLayout(PartnerShipActivity.this), false); + view.setBackground(new ColorDrawable(ContextCompat.getColor(PartnerShipActivity.this, R.color.cyanea_primary))); + actionBar.setCustomView(view, new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); + actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); + ImageView toolbar_close = actionBar.getCustomView().findViewById(R.id.toolbar_close); + TextView toolbar_title = actionBar.getCustomView().findViewById(R.id.toolbar_title); + toolbar_close.setOnClickListener(v -> finish()); + toolbar_title.setText(R.string.action_partnership); + } + + TextView about_partnership = findViewById(R.id.about_partnership); + about_partnership.setMovementMethod(LinkMovementMethod.getInstance()); + + binding.mastohostLogo.setOnClickListener(v -> { + Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://masto.host")); + startActivity(browserIntent); + }); + binding.accountFollow.setBackgroundTintList(ThemeHelper.getButtonActionColorStateList(PartnerShipActivity.this)); + setTitle(R.string.action_partnership); + binding.accountFollow.setImageResource(R.drawable.ic_baseline_person_add_24); + CrossActionHelper.fetchRemoteAccount(PartnerShipActivity.this, "@mastohost@mastodon.social", new CrossActionHelper.Callback() { + @Override + public void federatedStatus(Status status) { + + } + + @Override + public void federatedAccount(Account account) { + if (account != null && account.username.equalsIgnoreCase("mastohost")) { + binding.acccountContainer.setVisibility(View.VISIBLE); + MastodonHelper.loadPPMastodon(binding.accountPp, account); + binding.accountDn.setText(account.display_name); + binding.accountUn.setText(account.acct); + binding.accountPp.setOnClickListener(v -> { + Intent intent = new Intent(PartnerShipActivity.this, ProfileActivity.class); + Bundle b = new Bundle(); + b.putSerializable(Helper.ARG_ACCOUNT, account); + intent.putExtras(b); + ActivityOptionsCompat options = ActivityOptionsCompat + .makeSceneTransitionAnimation(PartnerShipActivity.this, binding.accountPp, getString(R.string.activity_porfile_pp)); + startActivity(intent, options.toBundle()); + }); + AccountsVM accountsVM = new ViewModelProvider(PartnerShipActivity.this).get(AccountsVM.class); + List ids = new ArrayList<>(); + ids.add(account.id); + accountsVM.getRelationships(MainActivity.currentInstance, MainActivity.currentToken, ids) + .observe(PartnerShipActivity.this, relationShips -> { + if (relationShips != null && relationShips.size() > 0) { + if (!relationShips.get(0).following) { + binding.accountFollow.setVisibility(View.VISIBLE); + binding.accountFollow.setOnClickListener(v -> accountsVM.follow(MainActivity.currentInstance, MainActivity.currentToken, account.id, true, false) + .observe(PartnerShipActivity.this, relationShip -> binding.accountFollow.setVisibility(View.GONE))); + } + } + }); + } + } + }); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == android.R.id.home) { + finish(); + return true; + } + return super.onOptionsItemSelected(item); + } + +} diff --git a/app/src/main/java/app/fedilab/android/activities/ProfileActivity.java b/app/src/main/java/app/fedilab/android/activities/ProfileActivity.java index 1a131c75..e73afa80 100644 --- a/app/src/main/java/app/fedilab/android/activities/ProfileActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/ProfileActivity.java @@ -536,7 +536,7 @@ public class ProfileActivity extends BaseActivity { private void updateAccount() { //The value for account is from same server so id can be used - if (account.id.equals(BaseMainActivity.accountWeakReference.get().user_id)) { + if (BaseMainActivity.accountWeakReference.get() != null && account.id.equals(BaseMainActivity.accountWeakReference.get().user_id)) { binding.accountFollow.setVisibility(View.GONE); binding.headerEditProfile.setVisibility(View.VISIBLE); binding.headerEditProfile.bringToFront(); @@ -563,20 +563,7 @@ public class ProfileActivity extends BaseActivity { }); } } - int[][] states = new int[][]{ - new int[]{android.R.attr.state_enabled}, // enabled - new int[]{-android.R.attr.state_enabled}, // disabled - new int[]{-android.R.attr.state_checked}, // unchecked - new int[]{android.R.attr.state_pressed} // pressed - }; - - int[] colors = new int[]{ - ContextCompat.getColor(ProfileActivity.this, R.color.mastodonC4), - ContextCompat.getColor(ProfileActivity.this, R.color.mastodonC4___), - ContextCompat.getColor(ProfileActivity.this, R.color.mastodonC4), - ContextCompat.getColor(ProfileActivity.this, R.color.mastodonC4) - }; - binding.accountFollow.setBackgroundTintList(new ColorStateList(states, colors)); + binding.accountFollow.setBackgroundTintList(ThemeHelper.getButtonActionColorStateList(ProfileActivity.this)); binding.accountFollow.setEnabled(true); //Visibility depending of the relationship if (relationship != null) { diff --git a/app/src/main/java/app/fedilab/android/helper/Helper.java b/app/src/main/java/app/fedilab/android/helper/Helper.java index 04599fbb..b3ab9680 100644 --- a/app/src/main/java/app/fedilab/android/helper/Helper.java +++ b/app/src/main/java/app/fedilab/android/helper/Helper.java @@ -151,6 +151,7 @@ public class Helper { public static final String INSTANCE_SOCIAL_KEY = "jGj9gW3z9ptyIpB8CMGhAlTlslcemMV6AgoiImfw3vPP98birAJTHOWiu5ZWfCkLvcaLsFZw9e3Pb7TIwkbIyrj3z6S7r2oE6uy6EFHvls3YtapP8QKNZ980p9RfzTb4"; public static final String WEBSITE_VALUE = "https://fedilab.app"; + public static final String OLD_DB_NAME = "mastodon_etalab_db"; public static final String RECEIVE_TOAST_MESSAGE = "RECEIVE_TOAST_MESSAGE"; public static final String RECEIVE_TOAST_TYPE = "RECEIVE_TOAST_TYPE"; @@ -1572,4 +1573,28 @@ public class Helper { }).start(); } } + + + public static void transfertIfExist(Context context) { + File dbFile = context.getDatabasePath(OLD_DB_NAME); + if (!dbFile.exists()) { + return; + } + int version = -1; + try { + SQLiteDatabase sqlDb = SQLiteDatabase.openDatabase + (context.getDatabasePath(OLD_DB_NAME).getAbsolutePath(), null, SQLiteDatabase.OPEN_READONLY); + version = sqlDb.getVersion(); + } catch (Exception ignored) { + } + try { + if (version == -1) { + version = 38; + } + SQLiteDatabase oldDb = Sqlite.getInstance(context.getApplicationContext(), OLD_DB_NAME, null, version).open(); + + } catch (Exception ignored) { + } + context.deleteDatabase(OLD_DB_NAME); + } } diff --git a/app/src/main/java/app/fedilab/android/helper/PinnedTimelineHelper.java b/app/src/main/java/app/fedilab/android/helper/PinnedTimelineHelper.java index 2886b552..8b5397b8 100644 --- a/app/src/main/java/app/fedilab/android/helper/PinnedTimelineHelper.java +++ b/app/src/main/java/app/fedilab/android/helper/PinnedTimelineHelper.java @@ -263,10 +263,13 @@ public class PinnedTimelineHelper { try { //If some menu items have been hidden we should not create tab for them bottomMenuDb = new BottomMenu(context).getAllBottomMenu(MainActivity.accountWeakReference.get()); - if (bottomMenuDb != null && bottomMenuDb.bottom_menu != null) { - for (BottomMenu.MenuItem menuItem : bottomMenuDb.bottom_menu) { - if (!menuItem.visible) { - toRemove++; + if (bottomMenuDb != null) { + List menuItemList = bottomMenuDb.bottom_menu; + if (menuItemList != null) { + for (BottomMenu.MenuItem menuItem : menuItemList) { + if (!menuItem.visible) { + toRemove++; + } } } } diff --git a/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java b/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java index faefd557..f5204a67 100644 --- a/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java +++ b/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java @@ -710,8 +710,8 @@ public class SpannableHelper { } catch (Exception ignored) { } } else { - Drawable drawable = Drawable.createFromPath(file.getAbsolutePath()); try { + Drawable drawable = Drawable.createFromPath(file.getAbsolutePath()); drawable.setBounds(0, 0, (int) convertDpToPixel(20, context), (int) convertDpToPixel(20, context)); drawable.setVisible(true, true); imageSpan = new ImageSpan(drawable); diff --git a/app/src/main/java/app/fedilab/android/helper/ThemeHelper.java b/app/src/main/java/app/fedilab/android/helper/ThemeHelper.java index 5ceefee6..cbdab195 100644 --- a/app/src/main/java/app/fedilab/android/helper/ThemeHelper.java +++ b/app/src/main/java/app/fedilab/android/helper/ThemeHelper.java @@ -282,6 +282,24 @@ public class ThemeHelper { return new ColorStateList(states, colors); } + public static ColorStateList getButtonActionColorStateList(Context context) { + int[][] states = new int[][]{ + new int[]{android.R.attr.state_enabled}, // enabled + new int[]{-android.R.attr.state_enabled}, // disabled + new int[]{-android.R.attr.state_checked}, // unchecked + new int[]{android.R.attr.state_pressed} // pressed + }; + int alphaColor = ColorUtils.setAlphaComponent(ContextCompat.getColor(context, R.color.cyanea_accent_dark_reference), 0x33); + int color = ContextCompat.getColor(context, R.color.cyanea_accent_dark_reference); + int[] colors = new int[]{ + color, + alphaColor, + color, + color + }; + return new ColorStateList(states, colors); + } + /** * Allow to set colors for having description on media diff --git a/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonTimeline.java b/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonTimeline.java index 6da90395..7f018916 100644 --- a/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonTimeline.java +++ b/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonTimeline.java @@ -149,8 +149,11 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter. private int getPosition(Status status) { int position = 0; boolean found = false; + if (status.id == null) { + return -1; + } for (Status _status : statuses) { - if (_status.id.compareTo(status.id) == 0) { + if (_status.id != null && _status.id.compareTo(status.id) == 0) { found = true; break; } diff --git a/app/src/main/res/drawable/ic_baseline_account_circle_24.xml b/app/src/main/res/drawable/ic_baseline_account_circle_24.xml new file mode 100644 index 00000000..0b3fa82b --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_account_circle_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/mastohost.png b/app/src/main/res/drawable/mastohost.png new file mode 100644 index 0000000000000000000000000000000000000000..f67e795cf77f8eca66d0ecc99c5917d13a731959 GIT binary patch literal 10009 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 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/menu/activity_main_drawer.xml b/app/src/main/res/menu/activity_main_drawer.xml index cdbc7e8e..87296e93 100644 --- a/app/src/main/res/menu/activity_main_drawer.xml +++ b/app/src/main/res/menu/activity_main_drawer.xml @@ -50,5 +50,10 @@ android:id="@+id/nav_about" android:icon="@drawable/ic_baseline_info_24" android:title="@string/action_about" /> + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e194a070..a0106270 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -542,7 +542,7 @@ Follow instance You already follow this instance! The instance is followed! - Masto.host is our Mastodon hosting partner.\n\nWith this partnership they provide me free hosting for Mastalab\'s instance and in exchange I promote them in here.\n\nTo be clear, there is no money involved or tracking of users. I needed an instance for testing, we talked and agreed on this.\n\nGo check them out if you want to run your own Mastodon instance. + Masto.host is our Mastodon hosting partner.\n\nWith this partnership they provide me free hosting for Fedilab\'s instance and in exchange I promote them in here.\n\nTo be clear, there is no money involved or tracking of users. I needed an instance for testing, we talked and agreed on this.\n\nGo check them out if you want to run your own Mastodon instance. Partnerships Information