diff --git a/twidere/src/main/java/org/mariotaku/twidere/model/tab/TabConfiguration.java b/twidere/src/main/java/org/mariotaku/twidere/model/tab/TabConfiguration.java index 7b4c75bf7..23a745741 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/model/tab/TabConfiguration.java +++ b/twidere/src/main/java/org/mariotaku/twidere/model/tab/TabConfiguration.java @@ -1,11 +1,12 @@ package org.mariotaku.twidere.model.tab; import android.content.Context; +import android.content.Intent; +import android.support.annotation.CallSuper; import android.support.annotation.IntDef; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.StringRes; -import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; @@ -16,6 +17,7 @@ import android.widget.TextView; import org.mariotaku.twidere.R; import org.mariotaku.twidere.annotation.CustomTabType; +import org.mariotaku.twidere.fragment.CustomTabsFragment.TabEditorDialogFragment; import org.mariotaku.twidere.model.Tab; import org.mariotaku.twidere.model.tab.impl.DMTabConfiguration; import org.mariotaku.twidere.model.tab.impl.FavoriteTimelineTabConfiguration; @@ -38,9 +40,10 @@ import kotlin.Pair; public abstract class TabConfiguration { - public static final int FLAG_HAS_ACCOUNT = 0b001; - public static final int FLAG_ACCOUNT_REQUIRED = 0b010; - public static final int FLAG_ACCOUNT_MULTIPLE = 0b100; + public static final int FLAG_HAS_ACCOUNT = 0b0001; + public static final int FLAG_ACCOUNT_REQUIRED = 0b0010; + public static final int FLAG_ACCOUNT_MULTIPLE = 0b0100; + public static final int FLAG_ACCOUNT_MUTABLE = 0b1000; @NonNull public abstract StringHolder getName(); @@ -48,8 +51,8 @@ public abstract class TabConfiguration { @NonNull public abstract DrawableHolder getIcon(); - @AccountRequirement - public abstract int getAccountRequirement(); + @AccountFlags + public abstract int getAccountFlags(); public boolean isSingleTab() { return false; @@ -67,16 +70,17 @@ public abstract class TabConfiguration { @NonNull public abstract Class getFragmentClass(); - public void applyExtraConfigurationTo(@NonNull Tab tab, @NonNull ExtraConfiguration extraConf) { - + public boolean applyExtraConfigurationTo(@NonNull Tab tab, @NonNull ExtraConfiguration extraConf) { + return true; } - public void readExtraConfigurationFrom(@NonNull Tab tab, @NonNull ExtraConfiguration extraConf) { - + public boolean readExtraConfigurationFrom(@NonNull Tab tab, @NonNull ExtraConfiguration extraConf) { + return false; } - @IntDef(value = {FLAG_HAS_ACCOUNT, FLAG_ACCOUNT_REQUIRED, FLAG_ACCOUNT_MULTIPLE}, flag = true) - protected @interface AccountRequirement { + @IntDef(value = {FLAG_HAS_ACCOUNT, FLAG_ACCOUNT_REQUIRED, FLAG_ACCOUNT_MULTIPLE, + FLAG_ACCOUNT_MUTABLE}, flag = true) + protected @interface AccountFlags { } @@ -133,6 +137,9 @@ public abstract class TabConfiguration { private StringHolder title; @Nullable private StringHolder headerTitle; + private int position; + private boolean mutable; + private Context context; protected ExtraConfiguration(String key) { this.key = key; @@ -179,10 +186,44 @@ public abstract class TabConfiguration { return this; } + public int getPosition() { + return position; + } + + public void setPosition(int position) { + this.position = position; + } + + public boolean isMutable() { + return mutable; + } + + public void setMutable(boolean mutable) { + this.mutable = mutable; + } + + public ExtraConfiguration mutable(boolean mutable) { + setMutable(mutable); + return this; + } + @NonNull public abstract View onCreateView(Context context, ViewGroup parent); - public void onViewCreated(@NonNull Context context, @NonNull View view, @NonNull DialogFragment fragment) { + @CallSuper + public void onCreate(Context context) { + this.context = context; + } + + public final Context getContext() { + return context; + } + + public void onViewCreated(@NonNull Context context, @NonNull View view, @NonNull TabEditorDialogFragment fragment) { + + } + + public void onActivityResult(int requestCode, int resultCode, Intent data) { } } @@ -200,11 +241,11 @@ public abstract class TabConfiguration { @NonNull @Override public View onCreateView(Context context, ViewGroup parent) { - return LayoutInflater.from(context).inflate(R.layout.list_item_extra_config, parent, false); + return LayoutInflater.from(context).inflate(R.layout.layout_extra_config_checkbox, parent, false); } @Override - public void onViewCreated(@NonNull Context context, @NonNull View view, @NonNull DialogFragment fragment) { + public void onViewCreated(@NonNull Context context, @NonNull View view, @NonNull TabEditorDialogFragment fragment) { final TextView titleView = (TextView) view.findViewById(android.R.id.title); titleView.setText(getTitle().createString(context)); @@ -247,7 +288,7 @@ public abstract class TabConfiguration { } @Override - public void onViewCreated(@NonNull Context context, @NonNull View view, @NonNull DialogFragment fragment) { + public void onViewCreated(@NonNull Context context, @NonNull View view, @NonNull final TabEditorDialogFragment fragment) { editText = (EditText) view.findViewById(R.id.editText); editText.setHint(getTitle().createString(context)); editText.setText(def); diff --git a/twidere/src/main/java/org/mariotaku/twidere/model/tab/conf/UserExtraConfiguration.java b/twidere/src/main/java/org/mariotaku/twidere/model/tab/conf/UserExtraConfiguration.java deleted file mode 100644 index ef0ab9baf..000000000 --- a/twidere/src/main/java/org/mariotaku/twidere/model/tab/conf/UserExtraConfiguration.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.mariotaku.twidere.model.tab.conf; - -import android.content.Context; -import android.content.Intent; -import android.support.annotation.NonNull; -import android.support.v4.app.DialogFragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import org.mariotaku.twidere.R; -import org.mariotaku.twidere.activity.UserListSelectorActivity; -import org.mariotaku.twidere.model.tab.TabConfiguration; - -import static org.mariotaku.twidere.constant.IntentConstants.INTENT_ACTION_SELECT_USER; - -/** - * Created by mariotaku on 2016/11/28. - */ - -public class UserExtraConfiguration extends TabConfiguration.ExtraConfiguration { - public UserExtraConfiguration(String key) { - super(key); - } - - - @NonNull - @Override - public View onCreateView(Context context, ViewGroup parent) { - return LayoutInflater.from(context).inflate(R.layout.list_item_simple_user, parent, false); - } - - @Override - public void onViewCreated(@NonNull final Context context, @NonNull View view, @NonNull final DialogFragment fragment) { - view.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - final Intent intent = new Intent(INTENT_ACTION_SELECT_USER); - intent.setClass(context, UserListSelectorActivity.class); - fragment.startActivity(intent); - } - }); - } -} diff --git a/twidere/src/main/java/org/mariotaku/twidere/model/tab/conf/UserListExtraConfiguration.java b/twidere/src/main/java/org/mariotaku/twidere/model/tab/conf/UserListExtraConfiguration.java deleted file mode 100644 index dc07edf30..000000000 --- a/twidere/src/main/java/org/mariotaku/twidere/model/tab/conf/UserListExtraConfiguration.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.mariotaku.twidere.model.tab.conf; - -import android.content.Context; -import android.content.Intent; -import android.support.annotation.NonNull; -import android.support.v4.app.DialogFragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import org.mariotaku.twidere.R; -import org.mariotaku.twidere.activity.UserListSelectorActivity; -import org.mariotaku.twidere.model.tab.TabConfiguration; - -import static org.mariotaku.twidere.constant.IntentConstants.INTENT_ACTION_SELECT_USER; -import static org.mariotaku.twidere.constant.IntentConstants.INTENT_ACTION_SELECT_USER_LIST; - -/** - * Created by mariotaku on 2016/11/28. - */ - -public class UserListExtraConfiguration extends TabConfiguration.ExtraConfiguration { - public UserListExtraConfiguration(String key) { - super(key); - } - - - @NonNull - @Override - public View onCreateView(Context context, ViewGroup parent) { - return LayoutInflater.from(context).inflate(R.layout.list_item_simple_user_list, parent, false); - } - - @Override - public void onViewCreated(@NonNull final Context context, @NonNull final View view, @NonNull final DialogFragment fragment) { - view.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - final Intent intent = new Intent(INTENT_ACTION_SELECT_USER_LIST); - intent.setClass(context, UserListSelectorActivity.class); - fragment.startActivity(intent); - } - }); - } -} diff --git a/twidere/src/main/java/org/mariotaku/twidere/model/tab/iface/AccountCallback.java b/twidere/src/main/java/org/mariotaku/twidere/model/tab/iface/AccountCallback.java new file mode 100644 index 000000000..5a647b647 --- /dev/null +++ b/twidere/src/main/java/org/mariotaku/twidere/model/tab/iface/AccountCallback.java @@ -0,0 +1,12 @@ +package org.mariotaku.twidere.model.tab.iface; + +import org.mariotaku.twidere.model.ParcelableAccount; + +/** + * Created by mariotaku on 2016/11/30. + */ + +public interface AccountCallback { + + ParcelableAccount getAccount(); +} diff --git a/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/DMTabConfiguration.java b/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/DMTabConfiguration.java index f7debfd51..607d13e15 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/DMTabConfiguration.java +++ b/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/DMTabConfiguration.java @@ -5,9 +5,9 @@ import android.support.v4.app.Fragment; import org.mariotaku.twidere.R; import org.mariotaku.twidere.fragment.MessagesEntriesFragment; -import org.mariotaku.twidere.model.tab.TabConfiguration; import org.mariotaku.twidere.model.tab.DrawableHolder; import org.mariotaku.twidere.model.tab.StringHolder; +import org.mariotaku.twidere.model.tab.TabConfiguration; /** * Created by mariotaku on 2016/11/27. @@ -26,10 +26,10 @@ public class DMTabConfiguration extends TabConfiguration { return DrawableHolder.Builtin.MESSAGE; } - @AccountRequirement + @AccountFlags @Override - public int getAccountRequirement() { - return FLAG_HAS_ACCOUNT | FLAG_ACCOUNT_MULTIPLE; + public int getAccountFlags() { + return FLAG_HAS_ACCOUNT | FLAG_ACCOUNT_MULTIPLE | FLAG_ACCOUNT_MUTABLE; } @NonNull diff --git a/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/FavoriteTimelineTabConfiguration.java b/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/FavoriteTimelineTabConfiguration.java index 6296eaf6e..57dd71d65 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/FavoriteTimelineTabConfiguration.java +++ b/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/FavoriteTimelineTabConfiguration.java @@ -7,9 +7,12 @@ import android.support.v4.app.Fragment; import org.mariotaku.twidere.R; import org.mariotaku.twidere.fragment.UserFavoritesFragment; +import org.mariotaku.twidere.model.ParcelableUser; +import org.mariotaku.twidere.model.Tab; import org.mariotaku.twidere.model.tab.DrawableHolder; import org.mariotaku.twidere.model.tab.StringHolder; import org.mariotaku.twidere.model.tab.TabConfiguration; +import org.mariotaku.twidere.model.tab.argument.UserArguments; import org.mariotaku.twidere.model.tab.conf.UserExtraConfiguration; import static org.mariotaku.twidere.constant.IntentConstants.EXTRA_USER; @@ -31,9 +34,9 @@ public class FavoriteTimelineTabConfiguration extends TabConfiguration { return DrawableHolder.Builtin.FAVORITE; } - @AccountRequirement + @AccountFlags @Override - public int getAccountRequirement() { + public int getAccountFlags() { return FLAG_HAS_ACCOUNT | FLAG_ACCOUNT_REQUIRED; } @@ -45,6 +48,21 @@ public class FavoriteTimelineTabConfiguration extends TabConfiguration { }; } + @Override + public boolean applyExtraConfigurationTo(@NonNull Tab tab, @NonNull ExtraConfiguration extraConf) { + UserArguments arguments = (UserArguments) tab.getArguments(); + assert arguments != null; + switch (extraConf.getKey()) { + case EXTRA_USER: { + final ParcelableUser user = ((UserExtraConfiguration) extraConf).getValue(); + if (user == null) return false; + arguments.setUserKey(user.key); + break; + } + } + return true; + } + @NonNull @Override public Class getFragmentClass() { diff --git a/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/HomeTabConfiguration.java b/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/HomeTabConfiguration.java index 68fd97eea..9e18e9fe5 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/HomeTabConfiguration.java +++ b/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/HomeTabConfiguration.java @@ -34,24 +34,24 @@ public class HomeTabConfiguration extends TabConfiguration { return DrawableHolder.Builtin.HOME; } - @AccountRequirement + @AccountFlags @Override - public int getAccountRequirement() { - return FLAG_HAS_ACCOUNT | FLAG_ACCOUNT_MULTIPLE; + public int getAccountFlags() { + return FLAG_HAS_ACCOUNT | FLAG_ACCOUNT_MULTIPLE | FLAG_ACCOUNT_MUTABLE; } @Nullable @Override public ExtraConfiguration[] getExtraConfigurations(Context context) { return new ExtraConfiguration[]{ - new BooleanExtraConfiguration(EXTRA_HIDE_RETWEETS, false).title(R.string.hide_retweets), - new BooleanExtraConfiguration(EXTRA_HIDE_QUOTES, false).title(R.string.hide_quotes), - new BooleanExtraConfiguration(EXTRA_HIDE_REPLIES, false).title(R.string.hide_replies), + new BooleanExtraConfiguration(EXTRA_HIDE_RETWEETS, false).title(R.string.hide_retweets).mutable(true), + new BooleanExtraConfiguration(EXTRA_HIDE_QUOTES, false).title(R.string.hide_quotes).mutable(true), + new BooleanExtraConfiguration(EXTRA_HIDE_REPLIES, false).title(R.string.hide_replies).mutable(true), }; } @Override - public void applyExtraConfigurationTo(@NonNull Tab tab, @NonNull ExtraConfiguration extraConf) { + public boolean applyExtraConfigurationTo(@NonNull Tab tab, @NonNull ExtraConfiguration extraConf) { final HomeTabExtras extras = (HomeTabExtras) tab.getExtras(); assert extras != null; switch (extraConf.getKey()) { @@ -68,12 +68,13 @@ public class HomeTabConfiguration extends TabConfiguration { break; } } + return true; } @Override - public void readExtraConfigurationFrom(@NonNull Tab tab, @NonNull ExtraConfiguration extraConf) { + public boolean readExtraConfigurationFrom(@NonNull Tab tab, @NonNull ExtraConfiguration extraConf) { final HomeTabExtras extras = (HomeTabExtras) tab.getExtras(); - if (extras == null) return; + if (extras == null) return false; switch (extraConf.getKey()) { case EXTRA_HIDE_RETWEETS: { ((BooleanExtraConfiguration) extraConf).setValue(extras.isHideRetweets()); @@ -88,6 +89,7 @@ public class HomeTabConfiguration extends TabConfiguration { break; } } + return true; } @NonNull diff --git a/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/InteractionsTabConfiguration.java b/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/InteractionsTabConfiguration.java index c3393592e..854abecb0 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/InteractionsTabConfiguration.java +++ b/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/InteractionsTabConfiguration.java @@ -33,23 +33,23 @@ public class InteractionsTabConfiguration extends TabConfiguration { return DrawableHolder.Builtin.NOTIFICATIONS; } - @AccountRequirement + @AccountFlags @Override - public int getAccountRequirement() { - return FLAG_HAS_ACCOUNT | FLAG_ACCOUNT_MULTIPLE; + public int getAccountFlags() { + return FLAG_HAS_ACCOUNT | FLAG_ACCOUNT_MULTIPLE | FLAG_ACCOUNT_MUTABLE; } @Nullable @Override public ExtraConfiguration[] getExtraConfigurations(Context context) { return new ExtraConfiguration[]{ - new BooleanExtraConfiguration(EXTRA_MY_FOLLOWING_ONLY, false).title(R.string.following_only), - new BooleanExtraConfiguration(EXTRA_MENTIONS_ONLY, false).title(R.string.mentions_only), + new BooleanExtraConfiguration(EXTRA_MY_FOLLOWING_ONLY, false).title(R.string.following_only).mutable(true), + new BooleanExtraConfiguration(EXTRA_MENTIONS_ONLY, false).title(R.string.mentions_only).mutable(true), }; } @Override - public void applyExtraConfigurationTo(@NonNull Tab tab, @NonNull ExtraConfiguration extraConf) { + public boolean applyExtraConfigurationTo(@NonNull Tab tab, @NonNull ExtraConfiguration extraConf) { final InteractionsTabExtras extras = (InteractionsTabExtras) tab.getExtras(); assert extras != null; switch (extraConf.getKey()) { @@ -62,12 +62,13 @@ public class InteractionsTabConfiguration extends TabConfiguration { break; } } + return true; } @Override - public void readExtraConfigurationFrom(@NonNull Tab tab, @NonNull ExtraConfiguration extraConf) { + public boolean readExtraConfigurationFrom(@NonNull Tab tab, @NonNull ExtraConfiguration extraConf) { final InteractionsTabExtras extras = (InteractionsTabExtras) tab.getExtras(); - if (extras == null) return; + if (extras == null) return false; switch (extraConf.getKey()) { case EXTRA_MY_FOLLOWING_ONLY: { ((BooleanExtraConfiguration) extraConf).setValue(extras.isMyFollowingOnly()); @@ -78,6 +79,7 @@ public class InteractionsTabConfiguration extends TabConfiguration { break; } } + return true; } @NonNull diff --git a/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/MessagesTabConfiguration.java b/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/MessagesTabConfiguration.java index 681ceff77..d32882879 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/MessagesTabConfiguration.java +++ b/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/MessagesTabConfiguration.java @@ -5,9 +5,9 @@ import android.support.v4.app.Fragment; import org.mariotaku.twidere.R; import org.mariotaku.twidere.fragment.DirectMessagesFragment; -import org.mariotaku.twidere.model.tab.TabConfiguration; import org.mariotaku.twidere.model.tab.DrawableHolder; import org.mariotaku.twidere.model.tab.StringHolder; +import org.mariotaku.twidere.model.tab.TabConfiguration; /** * Created by mariotaku on 2016/11/27. @@ -26,10 +26,10 @@ public class MessagesTabConfiguration extends TabConfiguration { return DrawableHolder.Builtin.MESSAGE; } - @AccountRequirement + @AccountFlags @Override - public int getAccountRequirement() { - return FLAG_HAS_ACCOUNT | FLAG_ACCOUNT_MULTIPLE; + public int getAccountFlags() { + return FLAG_HAS_ACCOUNT | FLAG_ACCOUNT_MULTIPLE | FLAG_ACCOUNT_MUTABLE; } @NonNull diff --git a/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/SearchTabConfiguration.java b/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/SearchTabConfiguration.java index 46047385c..345e3e685 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/SearchTabConfiguration.java +++ b/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/SearchTabConfiguration.java @@ -6,7 +6,7 @@ import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import org.mariotaku.twidere.R; -import org.mariotaku.twidere.fragment.TrendsSuggestionsFragment; +import org.mariotaku.twidere.fragment.StatusesSearchFragment; import org.mariotaku.twidere.model.Tab; import org.mariotaku.twidere.model.tab.DrawableHolder; import org.mariotaku.twidere.model.tab.StringHolder; @@ -32,9 +32,9 @@ public class SearchTabConfiguration extends TabConfiguration { return DrawableHolder.Builtin.SEARCH; } - @AccountRequirement + @AccountFlags @Override - public int getAccountRequirement() { + public int getAccountFlags() { return FLAG_HAS_ACCOUNT | FLAG_ACCOUNT_REQUIRED; } @@ -47,32 +47,36 @@ public class SearchTabConfiguration extends TabConfiguration { } @Override - public void applyExtraConfigurationTo(@NonNull Tab tab, @NonNull ExtraConfiguration extraConf) { + public boolean applyExtraConfigurationTo(@NonNull Tab tab, @NonNull ExtraConfiguration extraConf) { final TextQueryArguments arguments = (TextQueryArguments) tab.getArguments(); assert arguments != null; switch (extraConf.getKey()) { case EXTRA_QUERY: { - arguments.setQuery(((StringExtraConfiguration) extraConf).getValue()); + final String query = ((StringExtraConfiguration) extraConf).getValue(); + if (query == null) return false; + arguments.setQuery(query); break; } } + return true; } @Override - public void readExtraConfigurationFrom(@NonNull Tab tab, @NonNull ExtraConfiguration extraConf) { + public boolean readExtraConfigurationFrom(@NonNull Tab tab, @NonNull ExtraConfiguration extraConf) { final TextQueryArguments arguments = (TextQueryArguments) tab.getArguments(); - if (arguments == null) return; + if (arguments == null) return false; switch (extraConf.getKey()) { case EXTRA_QUERY: { ((StringExtraConfiguration) extraConf).setValue(arguments.getQuery()); break; } } + return true; } @NonNull @Override public Class getFragmentClass() { - return TrendsSuggestionsFragment.class; + return StatusesSearchFragment.class; } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/TrendsTabConfiguration.java b/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/TrendsTabConfiguration.java index 1205aa725..56c922bc6 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/TrendsTabConfiguration.java +++ b/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/TrendsTabConfiguration.java @@ -26,9 +26,9 @@ public class TrendsTabConfiguration extends TabConfiguration { return DrawableHolder.Builtin.TRENDS; } - @AccountRequirement + @AccountFlags @Override - public int getAccountRequirement() { + public int getAccountFlags() { return FLAG_HAS_ACCOUNT; } diff --git a/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/UserListTimelineTabConfiguration.java b/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/UserListTimelineTabConfiguration.java index e089d70ba..714d2d2bf 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/UserListTimelineTabConfiguration.java +++ b/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/UserListTimelineTabConfiguration.java @@ -7,9 +7,12 @@ import android.support.v4.app.Fragment; import org.mariotaku.twidere.R; import org.mariotaku.twidere.fragment.UserListTimelineFragment; -import org.mariotaku.twidere.model.tab.TabConfiguration; +import org.mariotaku.twidere.model.ParcelableUserList; +import org.mariotaku.twidere.model.Tab; import org.mariotaku.twidere.model.tab.DrawableHolder; import org.mariotaku.twidere.model.tab.StringHolder; +import org.mariotaku.twidere.model.tab.TabConfiguration; +import org.mariotaku.twidere.model.tab.argument.UserListArguments; import org.mariotaku.twidere.model.tab.conf.UserListExtraConfiguration; import static org.mariotaku.twidere.constant.IntentConstants.EXTRA_USER_LIST; @@ -31,9 +34,9 @@ public class UserListTimelineTabConfiguration extends TabConfiguration { return DrawableHolder.Builtin.LIST; } - @AccountRequirement + @AccountFlags @Override - public int getAccountRequirement() { + public int getAccountFlags() { return FLAG_HAS_ACCOUNT | FLAG_ACCOUNT_REQUIRED; } @@ -45,6 +48,21 @@ public class UserListTimelineTabConfiguration extends TabConfiguration { }; } + @Override + public boolean applyExtraConfigurationTo(@NonNull Tab tab, @NonNull ExtraConfiguration extraConf) { + UserListArguments arguments = (UserListArguments) tab.getArguments(); + assert arguments != null; + switch (extraConf.getKey()) { + case EXTRA_USER_LIST: { + final ParcelableUserList userList = ((UserListExtraConfiguration) extraConf).getValue(); + if (userList == null) return false; + arguments.setListId(userList.id); + break; + } + } + return true; + } + @NonNull @Override public Class getFragmentClass() { diff --git a/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/UserTimelineTabConfiguration.java b/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/UserTimelineTabConfiguration.java index 3628ae8ad..461428351 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/UserTimelineTabConfiguration.java +++ b/twidere/src/main/java/org/mariotaku/twidere/model/tab/impl/UserTimelineTabConfiguration.java @@ -7,9 +7,12 @@ import android.support.v4.app.Fragment; import org.mariotaku.twidere.R; import org.mariotaku.twidere.fragment.UserTimelineFragment; +import org.mariotaku.twidere.model.ParcelableUser; +import org.mariotaku.twidere.model.Tab; import org.mariotaku.twidere.model.tab.DrawableHolder; import org.mariotaku.twidere.model.tab.StringHolder; import org.mariotaku.twidere.model.tab.TabConfiguration; +import org.mariotaku.twidere.model.tab.argument.UserArguments; import org.mariotaku.twidere.model.tab.conf.UserExtraConfiguration; import static org.mariotaku.twidere.constant.IntentConstants.EXTRA_USER; @@ -31,9 +34,9 @@ public class UserTimelineTabConfiguration extends TabConfiguration { return DrawableHolder.Builtin.USER; } - @AccountRequirement + @AccountFlags @Override - public int getAccountRequirement() { + public int getAccountFlags() { return FLAG_HAS_ACCOUNT | FLAG_ACCOUNT_REQUIRED; } @@ -45,6 +48,21 @@ public class UserTimelineTabConfiguration extends TabConfiguration { }; } + @Override + public boolean applyExtraConfigurationTo(@NonNull Tab tab, @NonNull ExtraConfiguration extraConf) { + UserArguments arguments = (UserArguments) tab.getArguments(); + assert arguments != null; + switch (extraConf.getKey()) { + case EXTRA_USER: { + final ParcelableUser user = ((UserExtraConfiguration) extraConf).getValue(); + if (user == null) return false; + arguments.setUserKey(user.key); + break; + } + } + return true; + } + @NonNull @Override public Class getFragmentClass() { diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/MediaLoaderWrapper.java b/twidere/src/main/java/org/mariotaku/twidere/util/MediaLoaderWrapper.java index fb61624e8..b9494fe3d 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/MediaLoaderWrapper.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/MediaLoaderWrapper.java @@ -35,6 +35,7 @@ import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; import org.mariotaku.twidere.model.ParcelableAccount; import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.model.ParcelableUser; +import org.mariotaku.twidere.model.ParcelableUserList; import org.mariotaku.twidere.model.UserKey; import org.mariotaku.twidere.model.util.ParcelableUserUtils; import org.mariotaku.twidere.util.imageloader.OvalBitmapDisplayer; @@ -176,6 +177,10 @@ public class MediaLoaderWrapper { } } + public void displayProfileImage(final ImageView view, final ParcelableUserList userList) { + displayProfileImage(view, userList.user_profile_image_url); + } + public void displayProfileImage(final ImageView view, final ParcelableAccount account) { if (account.account_user != null && account.account_user.extras != null && !TextUtils.isEmpty(account.account_user.extras.profile_image_url_profile_size)) { diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/theme/TextViewViewProcessor.java b/twidere/src/main/java/org/mariotaku/twidere/util/theme/TextViewViewProcessor.java index e926000c7..74192e193 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/theme/TextViewViewProcessor.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/theme/TextViewViewProcessor.java @@ -4,12 +4,13 @@ import android.content.Context; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.text.Editable; -import android.text.TextWatcher; import android.widget.TextView; import com.afollestad.appthemeengine.Config; import com.afollestad.appthemeengine.viewprocessors.ViewProcessor; +import org.mariotaku.twidere.util.view.SimpleTextWatcher; + import static org.mariotaku.twidere.constant.SharedPreferenceConstants.VALUE_THEME_NAME_DARK; /** @@ -52,21 +53,4 @@ public class TextViewViewProcessor implements ViewProcessor { } } - abstract static class SimpleTextWatcher implements TextWatcher { - - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - - } - - @Override - public void afterTextChanged(Editable s) { - - } - } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/view/SimpleTextWatcher.java b/twidere/src/main/java/org/mariotaku/twidere/util/view/SimpleTextWatcher.java new file mode 100644 index 000000000..7b28b32b4 --- /dev/null +++ b/twidere/src/main/java/org/mariotaku/twidere/util/view/SimpleTextWatcher.java @@ -0,0 +1,25 @@ +package org.mariotaku.twidere.util.view; + +import android.text.Editable; +import android.text.TextWatcher; + +/** + * Created by mariotaku on 2016/11/30. + */ +public abstract class SimpleTextWatcher implements TextWatcher { + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + + } +} diff --git a/twidere/src/main/kotlin/DependencyHolder.kt b/twidere/src/main/kotlin/DependencyHolder.kt index fd4a693b3..a83b99409 100644 --- a/twidere/src/main/kotlin/DependencyHolder.kt +++ b/twidere/src/main/kotlin/DependencyHolder.kt @@ -62,6 +62,12 @@ class DependencyHolder internal constructor(context: Context) { @Inject lateinit var defaultFeatures: DefaultFeatures internal set + @Inject + lateinit var mediaLoader: MediaLoaderWrapper + internal set + @Inject + lateinit var userColorNameManager: UserColorNameManager + internal set init { GeneralComponentHelper.build(context).inject(this) diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/SimpleParcelableUsersAdapter.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/SimpleParcelableUsersAdapter.kt index c0c329d10..6ddd4572a 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/SimpleParcelableUsersAdapter.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/SimpleParcelableUsersAdapter.kt @@ -27,7 +27,7 @@ import org.mariotaku.twidere.adapter.iface.IBaseAdapter import org.mariotaku.twidere.model.ParcelableUser import org.mariotaku.twidere.model.UserKey import org.mariotaku.twidere.util.Utils.configBaseAdapter -import org.mariotaku.twidere.util.Utils.getUserTypeIconRes +import org.mariotaku.twidere.util.display import org.mariotaku.twidere.view.holder.TwoLineWithIconViewHolder class SimpleParcelableUsersAdapter @JvmOverloads constructor( @@ -61,16 +61,7 @@ class SimpleParcelableUsersAdapter @JvmOverloads constructor( val user = getItem(position) - holder.text1.setCompoundDrawablesWithIntrinsicBounds(0, 0, - getUserTypeIconRes(user.is_verified, user.is_protected), 0) - holder.text1.text = userColorNameManager.getUserNickname(user.key, user.name) - holder.text2.text = String.format("@%s", user.screen_name) - holder.icon.visibility = if (isProfileImageDisplayed) View.VISIBLE else View.GONE - if (isProfileImageDisplayed) { - mediaLoader.displayProfileImage(holder.icon, user) - } else { - mediaLoader.cancelDisplayTask(holder.icon) - } + holder.display(user, mediaLoader, userColorNameManager, isProfileImageDisplayed) return view } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/CustomTabsFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/CustomTabsFragment.kt index 0ef8fa990..b22d00f5a 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/CustomTabsFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/CustomTabsFragment.kt @@ -34,6 +34,7 @@ import android.support.v4.content.CursorLoader import android.support.v4.content.Loader import android.support.v7.app.AlertDialog import android.text.TextUtils +import android.util.SparseArray import android.view.* import android.widget.* import android.widget.AbsListView.MultiChoiceModeListener @@ -60,6 +61,7 @@ import org.mariotaku.twidere.model.TabCursorIndices import org.mariotaku.twidere.model.TabValuesCreator import org.mariotaku.twidere.model.tab.DrawableHolder import org.mariotaku.twidere.model.tab.TabConfiguration +import org.mariotaku.twidere.model.tab.iface.AccountCallback import org.mariotaku.twidere.provider.TwidereDataStore.Tabs import org.mariotaku.twidere.util.CustomTabUtils import org.mariotaku.twidere.util.DataStoreUtils @@ -165,7 +167,7 @@ class CustomTabsFragment : BaseSupportFragment(), LoaderCallbacks, Mult val subMenu = itemAdd.subMenu subMenu.clear() for ((type, conf) in TabConfiguration.all()) { - val accountIdRequired = (conf.accountRequirement and TabConfiguration.FLAG_ACCOUNT_REQUIRED) != 0 + val accountIdRequired = (conf.accountFlags and TabConfiguration.FLAG_ACCOUNT_REQUIRED) != 0 val subItem = subMenu.add(0, 0, conf.sortPosition, conf.name.createString(context)) val disabledByNoAccount = accountIdRequired && accountIds.isEmpty() val disabledByDuplicateTab = conf.isSingleTab && CustomTabUtils.isTabAdded(context, type) @@ -259,16 +261,12 @@ class CustomTabsFragment : BaseSupportFragment(), LoaderCallbacks, Mult mode.title = resources.getQuantityString(R.plurals.Nitems_selected, count, count) } - class TabEditorDialogFragment : BaseDialogFragment() { - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - } + class TabEditorDialogFragment : BaseDialogFragment(), DialogInterface.OnShowListener, AccountCallback { - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - val builder = AlertDialog.Builder(context) - builder.setView(R.layout.dialog_custom_tab_editor) - builder.setPositiveButton(R.string.save, null) - builder.setNegativeButton(android.R.string.cancel, null) + private val activityResultMap: SparseArray = SparseArray() + + override fun onShow(dialog: DialogInterface) { + dialog as AlertDialog @CustomTabType val tabType: String val tab: Tab @@ -292,89 +290,133 @@ class CustomTabsFragment : BaseSupportFragment(), LoaderCallbacks, Mult } } - val dialog = builder.create() - dialog.setOnShowListener { - val tabName = dialog.findViewById(R.id.tabName) as EditText - val iconSpinner = dialog.findViewById(R.id.tab_icon_spinner) as Spinner - val accountSpinner = dialog.findViewById(R.id.account_spinner) as Spinner - val accountContainer = dialog.findViewById(R.id.account_container)!! - val accountSectionHeader = accountContainer.sectionHeader - val extraConfigContainer = dialog.findViewById(R.id.extra_config_container) as LinearLayout + val tabName = dialog.findViewById(R.id.tabName) as EditText + val iconSpinner = dialog.findViewById(R.id.tab_icon_spinner) as Spinner + val accountSpinner = dialog.findViewById(R.id.account_spinner) as Spinner + val accountContainer = dialog.findViewById(R.id.account_container)!! + val accountSectionHeader = accountContainer.sectionHeader + val extraConfigContainer = dialog.findViewById(R.id.extra_config_container) as LinearLayout - val positiveButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE) + val positiveButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE) - val iconsAdapter = TabIconsAdapter(context) - val accountsAdapter = AccountsSpinnerAdapter(context) - iconSpinner.adapter = iconsAdapter - accountSpinner.adapter = accountsAdapter + val iconsAdapter = TabIconsAdapter(context) + val accountsAdapter = AccountsSpinnerAdapter(context) + iconSpinner.adapter = iconsAdapter + accountSpinner.adapter = accountsAdapter - iconsAdapter.setData(DrawableHolder.builtins()) + iconsAdapter.setData(DrawableHolder.builtins()) - tabName.setText(tab.name ?: conf.name.createString(context)) - iconSpinner.setSelection(iconsAdapter.findPositionByKey(tab.icon)) - accountSectionHeader.setText(R.string.account) + tabName.hint = conf.name.createString(context) + tabName.setText(tab.name) + iconSpinner.setSelection(iconsAdapter.findPositionByKey(tab.icon)) + accountSectionHeader.setText(R.string.account) - val hasAccount = conf.accountRequirement and TabConfiguration.FLAG_HAS_ACCOUNT != 0 - if (hasAccount) { - accountContainer.visibility = View.VISIBLE - val accountIdRequired = conf.accountRequirement and TabConfiguration.FLAG_ACCOUNT_REQUIRED != 0 - accountsAdapter.clear() - if (!accountIdRequired) { - accountsAdapter.add(ParcelableAccount.dummyCredentials()) - } - val officialKeyOnly = arguments.getBoolean(EXTRA_OFFICIAL_KEY_ONLY, false) - accountsAdapter.addAll(DataStoreUtils.getCredentialsList(context, false, officialKeyOnly)) - accountsAdapter.setDummyItemText(R.string.activated_accounts) + val editMode = tag == TAG_EDIT_TAB - tab.arguments?.accountKeys?.firstOrNull()?.let { key -> - accountSpinner.setSelection(accountsAdapter.findPositionByKey(key)) - } - } else { - accountContainer.visibility = View.GONE + val hasAccount = conf.accountFlags and TabConfiguration.FLAG_HAS_ACCOUNT != 0 + val accountMutable = conf.accountFlags and TabConfiguration.FLAG_ACCOUNT_MUTABLE != 0 + if (hasAccount && (accountMutable || !editMode)) { + accountContainer.visibility = View.VISIBLE + val accountIdRequired = conf.accountFlags and TabConfiguration.FLAG_ACCOUNT_REQUIRED != 0 + accountsAdapter.clear() + if (!accountIdRequired) { + accountsAdapter.add(ParcelableAccount.dummyCredentials()) } + val officialKeyOnly = arguments.getBoolean(EXTRA_OFFICIAL_KEY_ONLY, false) + accountsAdapter.addAll(DataStoreUtils.getCredentialsList(context, false, officialKeyOnly)) + accountsAdapter.setDummyItemText(R.string.activated_accounts) - val extraConfigurations = conf.getExtraConfigurations(context).orEmpty() - - fun inflateHeader(title: String): View { - val headerView = LayoutInflater.from(context).inflate(R.layout.list_item_section_header, - extraConfigContainer, false) - headerView.sectionHeader.text = title - return headerView - } - - extraConfigurations.forEachIndexed { idx, extraConf -> - extraConf.headerTitle?.let { - extraConfigContainer.addView(inflateHeader(it.createString(context))) - } - val view = extraConf.onCreateView(context, extraConfigContainer) - extraConf.onViewCreated(context, view, this) - conf.readExtraConfigurationFrom(tab, extraConf) - extraConfigContainer.addView(view) - } - - positiveButton.setOnClickListener { - tab.name = tabName.text.toString() - tab.icon = (iconSpinner.selectedItem as DrawableHolder).persistentKey - tab.arguments = CustomTabUtils.newTabArguments(tabType) - if (hasAccount) { - val account = accountSpinner.selectedItem as ParcelableAccount - if (!account.is_dummy) { - tab.arguments?.accountKeys = arrayOf(account.account_key) - } else { - tab.arguments?.accountKeys = null - } - } - tab.extras = CustomTabUtils.newTabExtras(tabType) - extraConfigurations.forEach { - conf.applyExtraConfigurationTo(tab, it) - } - context.contentResolver.insert(Tabs.CONTENT_URI, TabValuesCreator.create(tab)) - dismiss() + tab.arguments?.accountKeys?.firstOrNull()?.let { key -> + accountSpinner.setSelection(accountsAdapter.findPositionByKey(key)) } + } else { + accountContainer.visibility = View.GONE } + + val extraConfigurations = conf.getExtraConfigurations(context).orEmpty() + + fun inflateHeader(title: String): View { + val headerView = LayoutInflater.from(context).inflate(R.layout.list_item_section_header, + extraConfigContainer, false) + headerView.sectionHeader.text = title + return headerView + } + + extraConfigurations.forEachIndexed { idx, extraConf -> + extraConf.onCreate(context) + extraConf.position = idx + 1 + // Hide immutable settings in edit mode + if (editMode && !extraConf.isMutable) return@forEachIndexed + extraConf.headerTitle?.let { + // Inflate header with headerTitle + extraConfigContainer.addView(inflateHeader(it.createString(context))) + } + val view = extraConf.onCreateView(context, extraConfigContainer) + extraConf.onViewCreated(context, view, this) + conf.readExtraConfigurationFrom(tab, extraConf) + extraConfigContainer.addView(view) + } + + positiveButton.setOnClickListener { + tab.name = tabName.text.toString() + tab.icon = (iconSpinner.selectedItem as DrawableHolder).persistentKey + tab.arguments = CustomTabUtils.newTabArguments(tabType) + if (hasAccount) { + val account = accountSpinner.selectedItem as ParcelableAccount + if (!account.is_dummy) { + tab.arguments?.accountKeys = arrayOf(account.account_key) + } else { + tab.arguments?.accountKeys = null + } + } + tab.extras = CustomTabUtils.newTabExtras(tabType) + extraConfigurations.forEach { + // Make sure immutable configuration skipped in edit mode + if (editMode && !it.isMutable) return@forEach + if (!conf.applyExtraConfigurationTo(tab, it)) { + return@setOnClickListener + } + } + when (tag) { + TAG_EDIT_TAB -> { + val where = Expression.equalsArgs(Tabs._ID).sql + val whereArgs = arrayOf(tab.id.toString()) + context.contentResolver.update(Tabs.CONTENT_URI, TabValuesCreator.create(tab), where, whereArgs) + } + TAG_ADD_TAB -> { + context.contentResolver.insert(Tabs.CONTENT_URI, TabValuesCreator.create(tab)) + } + } + dismiss() + } + } + + override fun getAccount(): ParcelableAccount { + return (dialog.findViewById(R.id.account_spinner) as Spinner).selectedItem as ParcelableAccount + } + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val builder = AlertDialog.Builder(context) + builder.setView(R.layout.dialog_custom_tab_editor) + builder.setPositiveButton(R.string.save, null) + builder.setNegativeButton(android.R.string.cancel, null) + val dialog = builder.create() + dialog.setOnShowListener(this) return dialog } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + val extraConf = activityResultMap.get(requestCode) + activityResultMap.remove(requestCode) + extraConf?.onActivityResult(requestCode and 0xFF, resultCode, data) + } + + fun startExtraConfigurationActivityForResult(extraConf: TabConfiguration.ExtraConfiguration, intent: Intent, requestCode: Int) { + val requestCodeInternal = extraConf.position shl 8 and 0xFF00 or (requestCode and 0xFF) + activityResultMap.put(requestCodeInternal, extraConf) + startActivityForResult(intent, requestCodeInternal) + } + companion object { const val TAG_EDIT_TAB = "edit_tab" diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/model/tab/conf/UserExtraConfiguration.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/model/tab/conf/UserExtraConfiguration.kt new file mode 100644 index 000000000..de34d889e --- /dev/null +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/model/tab/conf/UserExtraConfiguration.kt @@ -0,0 +1,68 @@ +package org.mariotaku.twidere.model.tab.conf + +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import org.mariotaku.twidere.R +import org.mariotaku.twidere.activity.UserListSelectorActivity +import org.mariotaku.twidere.constant.IntentConstants.* +import org.mariotaku.twidere.fragment.CustomTabsFragment.TabEditorDialogFragment +import org.mariotaku.twidere.model.ParcelableUser +import org.mariotaku.twidere.model.tab.TabConfiguration +import org.mariotaku.twidere.util.dagger.DependencyHolder +import org.mariotaku.twidere.util.display +import org.mariotaku.twidere.view.holder.TwoLineWithIconViewHolder + +/** + * Created by mariotaku on 2016/11/28. + */ + +class UserExtraConfiguration(key: String) : TabConfiguration.ExtraConfiguration(key) { + var value: ParcelableUser? = null + private set + + private lateinit var viewHolder: TwoLineWithIconViewHolder + private lateinit var dependencyHolder: DependencyHolder + private lateinit var hintView: View + + override fun onCreate(context: Context) { + super.onCreate(context) + this.dependencyHolder = DependencyHolder.get(context) + } + + override fun onCreateView(context: Context, parent: ViewGroup): View { + return LayoutInflater.from(context).inflate(R.layout.layout_extra_config_user, parent, false) + } + + override fun onViewCreated(context: Context, view: View, fragment: TabEditorDialogFragment) { + view.setOnClickListener { + val intent = Intent(INTENT_ACTION_SELECT_USER) + intent.putExtra(EXTRA_ACCOUNT_KEY, fragment.account.account_key) + intent.setClass(context, UserListSelectorActivity::class.java) + fragment.startExtraConfigurationActivityForResult(this@UserExtraConfiguration, intent, 1) + } + hintView = view.findViewById(R.id.selectUserHint) + viewHolder = TwoLineWithIconViewHolder(view.findViewById(R.id.listItem)) + + viewHolder.view.visibility = View.GONE + hintView.visibility = View.VISIBLE + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { + when (requestCode) { + 1 -> { + if (resultCode == Activity.RESULT_OK) { + val user: ParcelableUser = data.getParcelableExtra(EXTRA_USER) + viewHolder.display(user, dependencyHolder.mediaLoader, dependencyHolder.userColorNameManager, true) + viewHolder.view.visibility = View.VISIBLE + hintView.visibility = View.GONE + + this.value = user + } + } + } + } +} diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/model/tab/conf/UserListExtraConfiguration.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/model/tab/conf/UserListExtraConfiguration.kt new file mode 100644 index 000000000..3c9dd1915 --- /dev/null +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/model/tab/conf/UserListExtraConfiguration.kt @@ -0,0 +1,70 @@ +package org.mariotaku.twidere.model.tab.conf + +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import org.mariotaku.twidere.R +import org.mariotaku.twidere.activity.UserListSelectorActivity +import org.mariotaku.twidere.constant.IntentConstants.* +import org.mariotaku.twidere.fragment.CustomTabsFragment.TabEditorDialogFragment +import org.mariotaku.twidere.model.ParcelableUserList +import org.mariotaku.twidere.model.tab.TabConfiguration +import org.mariotaku.twidere.util.dagger.DependencyHolder +import org.mariotaku.twidere.util.view.display +import org.mariotaku.twidere.view.holder.SimpleUserListViewHolder + +/** + * Created by mariotaku on 2016/11/28. + */ + +class UserListExtraConfiguration(key: String) : TabConfiguration.ExtraConfiguration(key) { + var value: ParcelableUserList? = null + private set + + private lateinit var viewHolder: SimpleUserListViewHolder + private lateinit var dependencyHolder: DependencyHolder + private lateinit var hintView: View + + override fun onCreate(context: Context) { + super.onCreate(context) + this.dependencyHolder = DependencyHolder.get(context) + } + + override fun onCreateView(context: Context, parent: ViewGroup): View { + return LayoutInflater.from(context).inflate(R.layout.list_item_simple_user_list, parent, false) + } + + override fun onViewCreated(context: Context, view: View, fragment: TabEditorDialogFragment) { + view.setOnClickListener { + val intent = Intent(INTENT_ACTION_SELECT_USER_LIST) + intent.putExtra(EXTRA_ACCOUNT_KEY, fragment.account.account_key) + intent.setClass(context, UserListSelectorActivity::class.java) + fragment.startExtraConfigurationActivityForResult(this@UserListExtraConfiguration, intent, 1) + } + hintView = view.findViewById(R.id.selectUserHint) + viewHolder = SimpleUserListViewHolder(view.findViewById(R.id.listItem)) + + viewHolder.itemView.visibility = View.GONE + hintView.visibility = View.VISIBLE + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { + when (requestCode) { + 1 -> { + if (resultCode == Activity.RESULT_OK) { + val userList: ParcelableUserList = data.getParcelableExtra(EXTRA_USER_LIST) + viewHolder.display(userList, dependencyHolder.mediaLoader, + dependencyHolder.userColorNameManager, true) + viewHolder.itemView.visibility = View.VISIBLE + hintView.visibility = View.GONE + + this.value = userList + } + } + } + } +} + diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/util/TwoLineWithIconViewHolderExtensions.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/util/TwoLineWithIconViewHolderExtensions.kt new file mode 100644 index 000000000..9e8f50b44 --- /dev/null +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/util/TwoLineWithIconViewHolderExtensions.kt @@ -0,0 +1,27 @@ +package org.mariotaku.twidere.util + +import android.view.View +import org.mariotaku.twidere.model.ParcelableUser +import org.mariotaku.twidere.view.holder.TwoLineWithIconViewHolder + +/** + * Created by mariotaku on 2016/12/1. + */ + +fun TwoLineWithIconViewHolder.display( + user: ParcelableUser, + mediaLoader: MediaLoaderWrapper, + userColorNameManager: UserColorNameManager, + displayProfileImage: Boolean +) { + text1.setCompoundDrawablesWithIntrinsicBounds(0, 0, + Utils.getUserTypeIconRes(user.is_verified, user.is_protected), 0) + text1.text = userColorNameManager.getUserNickname(user.key, user.name) + text2.text = String.format("@%s", user.screen_name) + icon.visibility = if (displayProfileImage) View.VISIBLE else View.GONE + if (displayProfileImage) { + mediaLoader.displayProfileImage(icon, user) + } else { + mediaLoader.cancelDisplayTask(icon) + } +} \ No newline at end of file diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/util/view/SimpleUserListViewHolder.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/util/view/SimpleUserListViewHolder.kt new file mode 100644 index 000000000..efae21947 --- /dev/null +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/util/view/SimpleUserListViewHolder.kt @@ -0,0 +1,22 @@ +package org.mariotaku.twidere.util.view + +import android.view.View +import org.mariotaku.twidere.R +import org.mariotaku.twidere.model.ParcelableUserList +import org.mariotaku.twidere.util.MediaLoaderWrapper +import org.mariotaku.twidere.util.UserColorNameManager +import org.mariotaku.twidere.view.holder.SimpleUserListViewHolder + +fun SimpleUserListViewHolder.display(userList: ParcelableUserList, mediaLoader: MediaLoaderWrapper, + userColorNameManager: UserColorNameManager, + displayProfileImage: Boolean) { + nameView.text = userList.name + createdByView.text = createdByView.context.getString(R.string.created_by, + userColorNameManager.getDisplayName(userList, false)) + profileImageView.visibility = if (displayProfileImage) View.VISIBLE else View.GONE + if (displayProfileImage) { + mediaLoader.displayProfileImage(profileImageView, userList) + } else { + mediaLoader.cancelDisplayTask(profileImageView) + } +} \ No newline at end of file diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/SimpleUserListViewHolder.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/SimpleUserListViewHolder.kt new file mode 100644 index 000000000..5621c6c76 --- /dev/null +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/SimpleUserListViewHolder.kt @@ -0,0 +1,24 @@ +package org.mariotaku.twidere.view.holder + +import android.support.v7.widget.RecyclerView +import android.view.View +import android.widget.ImageView +import android.widget.TextView +import kotlinx.android.synthetic.main.list_item_simple_user_list.view.* + +/** + * Created by mariotaku on 2016/12/1. + */ + +class SimpleUserListViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + + val createdByView: TextView + val nameView: TextView + val profileImageView: ImageView + + init { + nameView = itemView.name + createdByView = itemView.createdBy + profileImageView = itemView.profileImage + } +} diff --git a/twidere/src/main/res/layout/list_item_extra_config.xml b/twidere/src/main/res/layout/layout_extra_config_checkbox.xml similarity index 100% rename from twidere/src/main/res/layout/list_item_extra_config.xml rename to twidere/src/main/res/layout/layout_extra_config_checkbox.xml diff --git a/twidere/src/main/res/layout/layout_extra_config_user.xml b/twidere/src/main/res/layout/layout_extra_config_user.xml new file mode 100644 index 000000000..d0d93ae82 --- /dev/null +++ b/twidere/src/main/res/layout/layout_extra_config_user.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/twidere/src/main/res/layout/layout_extra_config_user_list.xml b/twidere/src/main/res/layout/layout_extra_config_user_list.xml new file mode 100644 index 000000000..7491d5c8f --- /dev/null +++ b/twidere/src/main/res/layout/layout_extra_config_user_list.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/twidere/src/main/res/layout/list_item_simple_user.xml b/twidere/src/main/res/layout/list_item_simple_user.xml index d1ab60eca..90f2a28b2 100644 --- a/twidere/src/main/res/layout/list_item_simple_user.xml +++ b/twidere/src/main/res/layout/list_item_simple_user.xml @@ -18,12 +18,13 @@ --> @@ -50,7 +51,7 @@ android:id="@android:id/text1" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:singleLine="true" + android:maxLines="1" android:textAppearance="?android:attr/textAppearanceMedium" android:textColor="?android:textColorPrimary" tools:text="User name"/> @@ -59,7 +60,7 @@ android:id="@android:id/text2" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:singleLine="true" + android:maxLines="1" android:textAppearance="?android:attr/textAppearanceSmall" tools:text="\@screenname"/> diff --git a/twidere/src/main/res/layout/list_item_simple_user_list.xml b/twidere/src/main/res/layout/list_item_simple_user_list.xml index 5637fd6f9..fc8b7c8b5 100644 --- a/twidere/src/main/res/layout/list_item_simple_user_list.xml +++ b/twidere/src/main/res/layout/list_item_simple_user_list.xml @@ -23,6 +23,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_vertical" + android:minHeight="?listPreferredItemHeight" android:orientation="horizontal" android:padding="@dimen/element_spacing_normal"> @@ -41,8 +42,8 @@ android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:maxLines="1" android:paddingBottom="@dimen/element_spacing_xsmall" - android:singleLine="true" android:textAppearance="?android:attr/textAppearanceSmall" android:textColor="?android:attr/textColorPrimary" android:textStyle="bold" @@ -52,11 +53,11 @@ android:id="@+id/createdBy" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:maxLines="1" android:paddingTop="@dimen/element_spacing_xsmall" - android:singleLine="true" android:textAppearance="?android:attr/textAppearanceSmall" android:textColor="?android:attr/textColorSecondary" - tools:text="Created by Mariotaku"/> + tools:text="Created by User"/> + android:scaleType="fitCenter" + tools:src="@mipmap/ic_launcher"/> \ No newline at end of file