From 798b05ad3d3c181ae7aa9f611ae97b943b1e6cd7 Mon Sep 17 00:00:00 2001 From: stom79 Date: Sun, 4 Nov 2018 16:00:44 +0100 Subject: [PATCH] Quick change colors --- app/build.gradle | 1 + .../mastodon/activities/BaseMainActivity.java | 10 +- .../gouv/etalab/mastodon/helper/Helper.java | 121 +++++++++++++- .../etalab/mastodon/helper/MenuFloating.java | 155 ++++++++++++++++++ app/src/main/res/drawable-anydpi/ic_brush.xml | 9 + .../res/drawable-anydpi/ic_brush_white.xml | 9 + app/src/main/res/drawable/circular.xml | 12 ++ app/src/main/res/drawable/circular_black.xml | 12 ++ app/src/main/res/drawable/circular_dark.xml | 12 ++ app/src/main/res/layout/nav_header_main.xml | 5 +- app/src/main/res/values/dimens.xml | 2 +- 11 files changed, 339 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/fr/gouv/etalab/mastodon/helper/MenuFloating.java create mode 100644 app/src/main/res/drawable-anydpi/ic_brush.xml create mode 100644 app/src/main/res/drawable-anydpi/ic_brush_white.xml create mode 100644 app/src/main/res/drawable/circular.xml create mode 100644 app/src/main/res/drawable/circular_black.xml create mode 100644 app/src/main/res/drawable/circular_dark.xml diff --git a/app/build.gradle b/app/build.gradle index cebd2d260..1067e23ca 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -74,5 +74,6 @@ dependencies { implementation 'com.github.stom79:mytransl:1.5' implementation "com.koushikdutta.async:androidasync:2.+" implementation 'com.vanniktech:emoji-one:0.6.0-SNAPSHOT' + implementation 'com.oguzdev:CircularFloatingActionMenu:1.0.2' playstoreImplementation "io.github.kobakei:ratethisapp:$ratethisappLibraryVersion" } 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 04e641d84..f56af500a 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 @@ -16,6 +16,7 @@ package fr.gouv.etalab.mastodon.activities; import android.Manifest; import android.annotation.SuppressLint; +import android.app.Activity; import android.app.ActivityManager; import android.content.BroadcastReceiver; import android.content.Context; @@ -118,6 +119,7 @@ import fr.gouv.etalab.mastodon.fragments.DisplayScheduledTootsFragment; import fr.gouv.etalab.mastodon.fragments.WhoToFollowFragment; import fr.gouv.etalab.mastodon.helper.CrossActions; import fr.gouv.etalab.mastodon.helper.Helper; +import fr.gouv.etalab.mastodon.helper.MenuFloating; import fr.gouv.etalab.mastodon.interfaces.OnFilterActionInterface; import fr.gouv.etalab.mastodon.interfaces.OnListActionInterface; import fr.gouv.etalab.mastodon.interfaces.OnRetrieveEmojiAccountInterface; @@ -204,6 +206,7 @@ public abstract class BaseMainActivity extends BaseActivity private PopupMenu popup; private String instance_id; private int style; + private Activity activity; @Override protected void onCreate(Bundle savedInstanceState) { @@ -240,7 +243,7 @@ public abstract class BaseMainActivity extends BaseActivity finish(); return; } - + activity = this; rateThisApp(); SQLiteDatabase db = Sqlite.getInstance(getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); @@ -1335,7 +1338,8 @@ public abstract class BaseMainActivity extends BaseActivity startActivity(intent); } }); - updateHeaderAccountInfo(BaseMainActivity.this, account, headerLayout); + MenuFloating.tags = new ArrayList<>(); + updateHeaderAccountInfo(activity, account, headerLayout); //Locked account can see follow request if (account.isLocked()) { navigationView.getMenu().findItem(R.id.nav_follow_request).setVisible(true); @@ -2111,7 +2115,7 @@ public abstract class BaseMainActivity extends BaseActivity }else { SQLiteDatabase db = Sqlite.getInstance(BaseMainActivity.this, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); Account account = new AccountDAO(getApplicationContext(), db).getAccountByID(userId); - updateHeaderAccountInfo(BaseMainActivity.this, account, headerLayout); + updateHeaderAccountInfo(activity, account, headerLayout); } } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/helper/Helper.java b/app/src/main/java/fr/gouv/etalab/mastodon/helper/Helper.java index 489f0af02..35a9624e9 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/helper/Helper.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/helper/Helper.java @@ -37,6 +37,7 @@ import android.provider.MediaStore; import android.provider.OpenableColumns; import android.support.annotation.Nullable; import android.support.customtabs.CustomTabsIntent; + import android.support.design.widget.TabLayout; import android.support.media.ExifInterface; import android.support.v4.app.FragmentActivity; @@ -114,6 +115,9 @@ import com.bumptech.glide.request.target.Target; import com.bumptech.glide.request.transition.Transition; import com.google.common.reflect.TypeToken; import com.google.gson.Gson; +import com.oguzdev.circularfloatingactionmenu.library.FloatingActionButton; +import com.oguzdev.circularfloatingactionmenu.library.FloatingActionMenu; +import com.oguzdev.circularfloatingactionmenu.library.SubActionButton; import org.conscrypt.Conscrypt; @@ -1333,11 +1337,122 @@ public class Helper { * @param account Account - new account in use * @param headerLayout View - the menu header */ - public static void updateHeaderAccountInfo(final Activity activity, final Account account, final View headerLayout){ + public static void updateHeaderAccountInfo(Activity activity, final Account account, final View headerLayout){ ImageView profilePicture = headerLayout.findViewById(R.id.profilePicture); - TextView username = headerLayout.findViewById(R.id.username); TextView displayedName = headerLayout.findViewById(R.id.displayedName); + LinearLayout more_option_container = headerLayout.findViewById(R.id.more_option_container); + SharedPreferences sharedpreferences = activity.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); + + int theme = sharedpreferences.getInt(Helper.SET_THEME, Helper.THEME_DARK); + ImageView icon = new ImageView(activity); + + + FloatingActionButton.LayoutParams layoutparmans = new FloatingActionButton.LayoutParams((int)Helper.convertDpToPixel(35,activity),(int)Helper.convertDpToPixel(35,activity)); + FloatingActionButton.LayoutParams layoutparmanImg = new FloatingActionButton.LayoutParams((int)Helper.convertDpToPixel(25,activity),(int)Helper.convertDpToPixel(25,activity)); + layoutparmans.setMargins((int)Helper.convertDpToPixel(20, activity),0,0,0); + MenuFloating actionButton = null; + if( theme == THEME_LIGHT) { + icon.setImageDrawable(ContextCompat.getDrawable(activity, R.drawable.ic_brush)); + actionButton = new MenuFloating.Builder(activity) + .setContentView(icon, layoutparmanImg) + .setBackgroundDrawable(activity.getResources().getDrawable( R.drawable.circular)) + .setLayoutParams(layoutparmans) + .setTag("THEME") + .intoView(more_option_container) + .build(); + }else if( theme == THEME_DARK) { + icon.setImageDrawable(ContextCompat.getDrawable(activity, R.drawable.ic_brush_white)); + actionButton = new MenuFloating.Builder(activity) + .setContentView(icon, layoutparmanImg) + .setBackgroundDrawable(activity.getResources().getDrawable( R.drawable.circular_dark)) + .setLayoutParams(layoutparmans) + .setTag("THEME") + .intoView(more_option_container) + .build(); + }else if( theme == THEME_BLACK) { + icon.setImageDrawable(ContextCompat.getDrawable(activity, R.drawable.ic_brush_white)); + actionButton = new MenuFloating.Builder(activity) + .setContentView(icon, layoutparmanImg) + .setBackgroundDrawable(activity.getResources().getDrawable( R.drawable.circular_black)) + .setLayoutParams(layoutparmans) + .setTag("THEME") + .intoView(more_option_container) + .build(); + } + + + SubActionButton.Builder itemBuilder = new SubActionButton.Builder(activity); + + // repeat many times: + ImageView itemIconLight = new ImageView(activity); + itemIconLight.setImageDrawable(ContextCompat.getDrawable(activity, R.drawable.ic_brush)); + SubActionButton buttonLight = itemBuilder + .setBackgroundDrawable(activity.getResources().getDrawable( R.drawable.circular)) + .setContentView(itemIconLight).build(); + + + ImageView itemDark = new ImageView(activity); + itemDark.setImageDrawable(ContextCompat.getDrawable(activity, R.drawable.ic_brush_white)); + SubActionButton buttonDark = itemBuilder + .setBackgroundDrawable(activity.getResources().getDrawable( R.drawable.circular_dark)) + .setContentView(itemDark).build(); + + ImageView itemBlack = new ImageView(activity); + itemBlack.setImageDrawable(ContextCompat.getDrawable(activity, R.drawable.ic_brush_white)); + SubActionButton buttonBlack = itemBuilder + .setBackgroundDrawable(activity.getResources().getDrawable( R.drawable.circular_black)) + .setContentView(itemBlack).build(); + + FloatingActionMenu actionMenu = new FloatingActionMenu.Builder(activity) + .addSubActionView(buttonLight) + .addSubActionView(buttonDark) + .addSubActionView(buttonBlack) + .attachTo(actionButton) + .setStartAngle(0) + .setEndAngle(90) + .build(); + + buttonLight.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + actionMenu.close(true); + SharedPreferences.Editor editor = sharedpreferences.edit(); + editor.putInt(Helper.SET_THEME, Helper.THEME_LIGHT); + editor.apply(); + activity.recreate(); + Intent intent = new Intent(activity, MainActivity.class); + activity.finish(); + activity.startActivity(intent); + } + }); + buttonDark.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + actionMenu.close(true); + SharedPreferences.Editor editor = sharedpreferences.edit(); + editor.putInt(Helper.SET_THEME, Helper.THEME_DARK); + editor.apply(); + activity.recreate(); + Intent intent = new Intent(activity, MainActivity.class); + activity.finish(); + activity.startActivity(intent); + } + }); + buttonBlack.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + actionMenu.close(true); + SharedPreferences.Editor editor = sharedpreferences.edit(); + editor.putInt(Helper.SET_THEME, Helper.THEME_BLACK); + editor.apply(); + activity.recreate(); + Intent intent = new Intent(activity, MainActivity.class); + activity.finish(); + activity.startActivity(intent); + } + }); + if( account == null ) { Helper.logout(activity); Intent myIntent = new Intent(activity, LoginActivity.class); @@ -1360,8 +1475,6 @@ public class Helper { urlHeader = Helper.getLiveInstanceWithProtocol(activity) + account.getHeader(); } LinearLayout main_header_container = headerLayout.findViewById(R.id.main_header_container); - final SharedPreferences sharedpreferences = activity.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); - int theme = sharedpreferences.getInt(Helper.SET_THEME, Helper.THEME_DARK); if( theme == Helper.THEME_LIGHT){ main_header_container.setBackgroundDrawable( activity.getResources().getDrawable(R.drawable.side_nav_bar_dark)); } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/helper/MenuFloating.java b/app/src/main/java/fr/gouv/etalab/mastodon/helper/MenuFloating.java new file mode 100644 index 000000000..eea802d3b --- /dev/null +++ b/app/src/main/java/fr/gouv/etalab/mastodon/helper/MenuFloating.java @@ -0,0 +1,155 @@ +package fr.gouv.etalab.mastodon.helper; + +import android.app.Activity; +import android.content.Context; +import android.graphics.PixelFormat; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.util.Log; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.FrameLayout; + + +import com.oguzdev.circularfloatingactionmenu.library.FloatingActionButton; + +import java.util.ArrayList; +import java.util.List; + +import fr.gouv.etalab.mastodon.R; + +public class MenuFloating extends com.oguzdev.circularfloatingactionmenu.library.FloatingActionButton { + + public static List tags; + + public MenuFloating(Activity activity, LayoutParams layoutParams, int theme, Drawable backgroundDrawable, int position, View contentView, FrameLayout.LayoutParams contentParams, View attachedTo, String tag) { + super(activity, layoutParams, theme, backgroundDrawable, position, null, contentParams); + super.detach(); + setPosition(position, layoutParams); + // If no custom backgroundDrawable is specified, use the background drawable of the theme. + if(backgroundDrawable == null) { + if(theme == THEME_LIGHT) + backgroundDrawable = activity.getResources().getDrawable(R.drawable.button_action_selector); + else + backgroundDrawable = activity.getResources().getDrawable(R.drawable.button_action_dark_selector); + } + setBackgroundResource(backgroundDrawable); + + if(tags == null || !tags.contains(tag)) { + if( tags == null) + tags = new ArrayList<>(); + if (contentView != null) { + setContentView(contentView, contentParams); + } + setClickable(true); + attach(attachedTo, layoutParams); + tags.add(tag); + } + } + + + /** + * Attaches it to the content view with specified LayoutParams. + * @param layoutParams + */ + public void attach(View view, ViewGroup.LayoutParams layoutParams) { + if(this.getParent()!=null) + ((ViewGroup)this.getParent()).removeView(this); + ((ViewGroup)view).addView(this, layoutParams); + } + + private void setBackgroundResource(Drawable drawable) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + setBackground(drawable); + } + else { + setBackgroundDrawable(drawable); + } + } + + /** + * A builder for {@link MenuFloating} in conventional Java Builder format + */ + public static class Builder { + + private Activity activity; + private FloatingActionButton.LayoutParams layoutParams; + private int theme; + private Drawable backgroundDrawable; + private int position; + private View contentView; + private LayoutParams contentParams; + private View targetedView; + private String tag; + + public Builder(Activity activity) { + this.activity = activity; + + // Default MenuFloating settings + int size = activity.getResources().getDimensionPixelSize(R.dimen.action_button_size); + int margin = activity.getResources().getDimensionPixelSize(R.dimen.action_button_margin); + FloatingActionButton.LayoutParams layoutParams = new LayoutParams(size, size, Gravity.BOTTOM | Gravity.RIGHT); + layoutParams.setMargins(margin, margin, margin, margin); + setLayoutParams(layoutParams); + setTheme(FloatingActionButton.THEME_LIGHT); + setPosition(FloatingActionButton.POSITION_BOTTOM_RIGHT); + } + + public Builder intoView(View view){ + this.targetedView = view; + return this; + } + + public Builder setLayoutParams(FloatingActionButton.LayoutParams params) { + this.layoutParams = params; + return this; + } + + public Builder setTheme(int theme) { + this.theme = theme; + return this; + } + + public Builder setBackgroundDrawable(Drawable backgroundDrawable) { + this.backgroundDrawable = backgroundDrawable; + return this; + } + + public Builder setBackgroundDrawable(int drawableId) { + return setBackgroundDrawable(activity.getResources().getDrawable(drawableId)); + } + + public Builder setPosition(int position) { + this.position = position; + return this; + } + + public Builder setContentView(View contentView) { + return setContentView(contentView, null); + } + + public Builder setContentView(View contentView, LayoutParams contentParams) { + this.contentView = contentView; + this.contentParams = contentParams; + return this; + } + public Builder setTag(String tag) { + this.tag = tag; + return this; + } + + public MenuFloating build() { + return new MenuFloating(activity, + layoutParams, + theme, + backgroundDrawable, + position, + contentView, + contentParams, + targetedView, tag); + } + } + +} diff --git a/app/src/main/res/drawable-anydpi/ic_brush.xml b/app/src/main/res/drawable-anydpi/ic_brush.xml new file mode 100644 index 000000000..54730dbe2 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/ic_brush.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/ic_brush_white.xml b/app/src/main/res/drawable-anydpi/ic_brush_white.xml new file mode 100644 index 000000000..500cb4a5f --- /dev/null +++ b/app/src/main/res/drawable-anydpi/ic_brush_white.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/circular.xml b/app/src/main/res/drawable/circular.xml new file mode 100644 index 000000000..8a605c487 --- /dev/null +++ b/app/src/main/res/drawable/circular.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/circular_black.xml b/app/src/main/res/drawable/circular_black.xml new file mode 100644 index 000000000..f89d22c35 --- /dev/null +++ b/app/src/main/res/drawable/circular_black.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/circular_dark.xml b/app/src/main/res/drawable/circular_dark.xml new file mode 100644 index 000000000..ab66bb19f --- /dev/null +++ b/app/src/main/res/drawable/circular_dark.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/nav_header_main.xml b/app/src/main/res/layout/nav_header_main.xml index 977a6f276..0309f6ff9 100644 --- a/app/src/main/res/layout/nav_header_main.xml +++ b/app/src/main/res/layout/nav_header_main.xml @@ -50,10 +50,13 @@ android:layout_height="60dp" tools:ignore="ContentDescription" /> + android:orientation="horizontal" + tools:ignore="UselessLeaf" > + + 16dp 16dp