diff --git a/app/src/main/assets/js/topic.js b/app/src/main/assets/js/topic.js index d469e40b..963e7827 100644 --- a/app/src/main/assets/js/topic.js +++ b/app/src/main/assets/js/topic.js @@ -22,8 +22,10 @@ Vue.filter('tabName', function (topic) { return '问答'; case 'job': return '招聘'; + case 'dev': + return '测试'; default: - return '全部'; + return '未知'; } } }); diff --git a/app/src/main/java/org/cnodejs/android/md/model/api/ApiService.java b/app/src/main/java/org/cnodejs/android/md/model/api/ApiService.java index 4f4f9016..564e7f08 100644 --- a/app/src/main/java/org/cnodejs/android/md/model/api/ApiService.java +++ b/app/src/main/java/org/cnodejs/android/md/model/api/ApiService.java @@ -2,7 +2,7 @@ import org.cnodejs.android.md.model.entity.Notification; import org.cnodejs.android.md.model.entity.Result; -import org.cnodejs.android.md.model.entity.TabType; +import org.cnodejs.android.md.model.entity.Tab; import org.cnodejs.android.md.model.entity.Topic; import org.cnodejs.android.md.model.entity.TopicWithReply; import org.cnodejs.android.md.model.entity.User; @@ -25,7 +25,7 @@ public interface ApiService { @GET("topics") Call>> getTopicList( - @Query("tab") TabType tab, + @Query("tab") Tab tab, @Query("page") Integer page, @Query("limit") Integer limit, @Query("mdrender") Boolean mdrender @@ -42,7 +42,7 @@ Call> getTopic( @FormUrlEncoded Call createTopic( @Field("accesstoken") String accessToken, - @Field("tab") TabType tab, + @Field("tab") Tab tab, @Field("title") String title, @Field("content") String content ); diff --git a/app/src/main/java/org/cnodejs/android/md/model/entity/Tab.java b/app/src/main/java/org/cnodejs/android/md/model/entity/Tab.java new file mode 100644 index 00000000..10a5de0e --- /dev/null +++ b/app/src/main/java/org/cnodejs/android/md/model/entity/Tab.java @@ -0,0 +1,50 @@ +package org.cnodejs.android.md.model.entity; + +import android.support.annotation.StringRes; + +import org.cnodejs.android.md.BuildConfig; +import org.cnodejs.android.md.R; + +import java.util.ArrayList; +import java.util.List; + +public enum Tab { + + all(R.string.app_name), + + good(R.string.tab_good), + + unknown(R.string.tab_unknown), + + share(R.string.tab_share), + + ask(R.string.tab_ask), + + job(R.string.tab_job), + + dev(R.string.tab_dev); + + @StringRes + private final int nameId; + + Tab(@StringRes int nameId) { + this.nameId = nameId; + } + + @StringRes + public int getNameId() { + return nameId; + } + + public static List getPublishableTabList() { + List tabList = new ArrayList<>(); + if (BuildConfig.DEBUG) { + tabList.add(dev); + } + tabList.add(share); + tabList.add(ask); + tabList.add(job); + return tabList; + } + +} diff --git a/app/src/main/java/org/cnodejs/android/md/model/entity/TabType.java b/app/src/main/java/org/cnodejs/android/md/model/entity/TabType.java deleted file mode 100644 index 4713df1b..00000000 --- a/app/src/main/java/org/cnodejs/android/md/model/entity/TabType.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.cnodejs.android.md.model.entity; - -import android.support.annotation.StringRes; - -import org.cnodejs.android.md.R; - -public enum TabType { - - all(R.string.app_name), - - good(R.string.tab_good), - - share(R.string.tab_share), - - ask(R.string.tab_ask), - - job(R.string.tab_job), - - unknown(R.string.tab_all); - - @StringRes - private int nameId; - - TabType(@StringRes int nameId) { - this.nameId = nameId; - } - - @StringRes - public int getNameId() { - return nameId; - } - -} diff --git a/app/src/main/java/org/cnodejs/android/md/model/entity/Topic.java b/app/src/main/java/org/cnodejs/android/md/model/entity/Topic.java index 6dd80a1e..2b3d2ee1 100644 --- a/app/src/main/java/org/cnodejs/android/md/model/entity/Topic.java +++ b/app/src/main/java/org/cnodejs/android/md/model/entity/Topic.java @@ -1,5 +1,7 @@ package org.cnodejs.android.md.model.entity; +import android.support.annotation.NonNull; + import com.google.gson.annotations.SerializedName; import org.cnodejs.android.md.model.api.ApiDefine; @@ -12,7 +14,7 @@ public class Topic extends TopicSimple { @SerializedName("author_id") private String authorId; - private TabType tab; + private Tab tab; private String content; @@ -37,11 +39,12 @@ public void setAuthorId(String authorId) { this.authorId = authorId; } - public TabType getTab() { - return tab == null ? TabType.unknown : tab; // 接口中有些话题没有Tab属性,这里保证Tab不为空 + @NonNull + public Tab getTab() { + return tab == null ? Tab.unknown : tab; // 接口中有些话题没有 Tab 属性,这里保证 Tab 不为空 } - public void setTab(TabType tab) { + public void setTab(Tab tab) { this.tab = tab; } diff --git a/app/src/main/java/org/cnodejs/android/md/presenter/contract/ICreateTopicPresenter.java b/app/src/main/java/org/cnodejs/android/md/presenter/contract/ICreateTopicPresenter.java index 08e70265..5e6ad99e 100644 --- a/app/src/main/java/org/cnodejs/android/md/presenter/contract/ICreateTopicPresenter.java +++ b/app/src/main/java/org/cnodejs/android/md/presenter/contract/ICreateTopicPresenter.java @@ -2,10 +2,10 @@ import android.support.annotation.NonNull; -import org.cnodejs.android.md.model.entity.TabType; +import org.cnodejs.android.md.model.entity.Tab; public interface ICreateTopicPresenter { - void createTopicAsyncTask(@NonNull TabType tab, String title, String content); + void createTopicAsyncTask(@NonNull Tab tab, String title, String content); } diff --git a/app/src/main/java/org/cnodejs/android/md/presenter/contract/IMainPresenter.java b/app/src/main/java/org/cnodejs/android/md/presenter/contract/IMainPresenter.java index b3c8d3e7..01928436 100644 --- a/app/src/main/java/org/cnodejs/android/md/presenter/contract/IMainPresenter.java +++ b/app/src/main/java/org/cnodejs/android/md/presenter/contract/IMainPresenter.java @@ -2,11 +2,11 @@ import android.support.annotation.NonNull; -import org.cnodejs.android.md.model.entity.TabType; +import org.cnodejs.android.md.model.entity.Tab; public interface IMainPresenter { - void switchTab(@NonNull TabType tab); + void switchTab(@NonNull Tab tab); void refreshTopicListAsyncTask(); diff --git a/app/src/main/java/org/cnodejs/android/md/presenter/implement/CreateTopicPresenter.java b/app/src/main/java/org/cnodejs/android/md/presenter/implement/CreateTopicPresenter.java index dab1c767..8c0f9a59 100644 --- a/app/src/main/java/org/cnodejs/android/md/presenter/implement/CreateTopicPresenter.java +++ b/app/src/main/java/org/cnodejs/android/md/presenter/implement/CreateTopicPresenter.java @@ -8,7 +8,7 @@ import org.cnodejs.android.md.model.api.ApiClient; import org.cnodejs.android.md.model.api.DefaultCallback; import org.cnodejs.android.md.model.entity.Result; -import org.cnodejs.android.md.model.entity.TabType; +import org.cnodejs.android.md.model.entity.Tab; import org.cnodejs.android.md.model.storage.LoginShared; import org.cnodejs.android.md.model.storage.SettingShared; import org.cnodejs.android.md.presenter.contract.ICreateTopicPresenter; @@ -27,7 +27,7 @@ public CreateTopicPresenter(@NonNull Activity activity, @NonNull ICreateTopicVie } @Override - public void createTopicAsyncTask(@NonNull TabType tab, String title, String content) { + public void createTopicAsyncTask(@NonNull Tab tab, String title, String content) { if (TextUtils.isEmpty(title) || title.length() < 10) { createTopicView.onTitleError(activity.getString(R.string.title_empty_error_tip)); } else if (TextUtils.isEmpty(content)) { diff --git a/app/src/main/java/org/cnodejs/android/md/presenter/implement/MainPresenter.java b/app/src/main/java/org/cnodejs/android/md/presenter/implement/MainPresenter.java index 8eae72fe..d538230c 100644 --- a/app/src/main/java/org/cnodejs/android/md/presenter/implement/MainPresenter.java +++ b/app/src/main/java/org/cnodejs/android/md/presenter/implement/MainPresenter.java @@ -8,7 +8,7 @@ import org.cnodejs.android.md.model.api.ApiDefine; import org.cnodejs.android.md.model.api.ForegroundCallback; import org.cnodejs.android.md.model.entity.Result; -import org.cnodejs.android.md.model.entity.TabType; +import org.cnodejs.android.md.model.entity.Tab; import org.cnodejs.android.md.model.entity.Topic; import org.cnodejs.android.md.model.entity.User; import org.cnodejs.android.md.model.storage.LoginShared; @@ -28,7 +28,7 @@ public class MainPresenter implements IMainPresenter { private final Activity activity; private final IMainView mainView; - private TabType tab = TabType.all; + private Tab tab = Tab.all; private Call>> refreshCall = null; private Call>> loadMoreCall = null; @@ -56,7 +56,7 @@ private void cancelLoadMoreCall() { } @Override - public void switchTab(@NonNull TabType tab) { + public void switchTab(@NonNull Tab tab) { if (this.tab != tab) { this.tab = tab; cancelRefreshCall(); diff --git a/app/src/main/java/org/cnodejs/android/md/ui/activity/CreateTopicActivity.java b/app/src/main/java/org/cnodejs/android/md/ui/activity/CreateTopicActivity.java index b2226e6f..96543ae7 100644 --- a/app/src/main/java/org/cnodejs/android/md/ui/activity/CreateTopicActivity.java +++ b/app/src/main/java/org/cnodejs/android/md/ui/activity/CreateTopicActivity.java @@ -10,11 +10,12 @@ import android.widget.Spinner; import org.cnodejs.android.md.R; -import org.cnodejs.android.md.model.entity.TabType; +import org.cnodejs.android.md.model.entity.Tab; import org.cnodejs.android.md.model.storage.SettingShared; import org.cnodejs.android.md.model.storage.TopicShared; import org.cnodejs.android.md.presenter.contract.ICreateTopicPresenter; import org.cnodejs.android.md.presenter.implement.CreateTopicPresenter; +import org.cnodejs.android.md.ui.adapter.TabSpinnerAdapter; import org.cnodejs.android.md.ui.base.StatusBarActivity; import org.cnodejs.android.md.ui.dialog.ProgressDialog; import org.cnodejs.android.md.ui.listener.NavigationFinishClickListener; @@ -61,6 +62,8 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { toolbar.inflateMenu(R.menu.create_topic); toolbar.setOnMenuItemClickListener(this); + spnTab.setAdapter(new TabSpinnerAdapter(this, Tab.getPublishableTabList())); + progressDialog = ProgressDialog.createWithAutoTheme(this); progressDialog.setCancelable(false); @@ -96,26 +99,13 @@ protected void onPause() { public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.action_send: - createTopicPresenter.createTopicAsyncTask(getTabByPosition(spnTab.getSelectedItemPosition()), edtTitle.getText().toString().trim(), edtContent.getText().toString().trim()); + createTopicPresenter.createTopicAsyncTask((Tab) spnTab.getSelectedItem(), edtTitle.getText().toString().trim(), edtContent.getText().toString().trim()); return true; default: return false; } } - private TabType getTabByPosition(int position) { - switch (position) { - case 0: - return TabType.share; - case 1: - return TabType.ask; - case 2: - return TabType.job; - default: - return TabType.share; - } - } - @Override public void onTitleError(@NonNull String message) { ToastUtils.with(this).show(message); diff --git a/app/src/main/java/org/cnodejs/android/md/ui/activity/MainActivity.java b/app/src/main/java/org/cnodejs/android/md/ui/activity/MainActivity.java index 8de6863b..65374576 100644 --- a/app/src/main/java/org/cnodejs/android/md/ui/activity/MainActivity.java +++ b/app/src/main/java/org/cnodejs/android/md/ui/activity/MainActivity.java @@ -20,8 +20,9 @@ import com.bumptech.glide.Glide; import com.takwolf.android.hfrecyclerview.HeaderAndFooterRecyclerView; +import org.cnodejs.android.md.BuildConfig; import org.cnodejs.android.md.R; -import org.cnodejs.android.md.model.entity.TabType; +import org.cnodejs.android.md.model.entity.Tab; import org.cnodejs.android.md.model.entity.Topic; import org.cnodejs.android.md.model.storage.LoginShared; import org.cnodejs.android.md.model.storage.SettingShared; @@ -92,10 +93,14 @@ public class MainActivity extends FullLayoutActivity implements IMainView, IBack R.id.btn_nav_good, R.id.btn_nav_share, R.id.btn_nav_ask, - R.id.btn_nav_job + R.id.btn_nav_job, + R.id.btn_nav_dev }) List navMainItemList; + @BindView(R.id.btn_nav_dev) + CheckedTextView navMainItemDev; + /* * 内容部分 */ @@ -133,6 +138,8 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { toolbar.setNavigationOnClickListener(new NavigationOpenClickListener(drawerLayout)); toolbar.setOnClickListener(new DoubleClickBackToContentTopListener(this)); + navMainItemDev.setVisibility(BuildConfig.DEBUG ? View.VISIBLE : View.GONE); + recyclerView.setLayoutManager(new LinearLayoutManager(this)); loadMoreFooter = new LoadMoreFooter(this, recyclerView, this); adapter = new TopicListAdapter(this); @@ -173,24 +180,27 @@ public void onDrawerOpened(View drawerView) { @Override public void onDrawerClosed(View drawerView) { - TabType tab = TabType.all; + Tab tab = Tab.all; for (CheckedTextView navItem : navMainItemList) { if (navItem.isChecked()) { switch (navItem.getId()) { case R.id.btn_nav_all: - tab = TabType.all; + tab = Tab.all; break; case R.id.btn_nav_good: - tab = TabType.good; + tab = Tab.good; break; case R.id.btn_nav_share: - tab = TabType.share; + tab = Tab.share; break; case R.id.btn_nav_ask: - tab = TabType.ask; + tab = Tab.ask; break; case R.id.btn_nav_job: - tab = TabType.job; + tab = Tab.job; + break; + case R.id.btn_nav_dev: + tab = Tab.dev; break; default: throw new AssertionError("Unknow tab."); @@ -218,7 +228,8 @@ public void onLoadMore() { R.id.btn_nav_good, R.id.btn_nav_share, R.id.btn_nav_ask, - R.id.btn_nav_job + R.id.btn_nav_job, + R.id.btn_nav_dev }) void onNavigationMainItemClick(CheckedTextView itemView) { for (CheckedTextView navItem : navMainItemList) { @@ -343,7 +354,7 @@ public void onBackPressed() { } @Override - public void onSwitchTabOk(@NonNull TabType tab) { + public void onSwitchTabOk(@NonNull Tab tab) { page = 0; toolbar.setTitle(tab.getNameId()); fabCreateTopic.show(); diff --git a/app/src/main/java/org/cnodejs/android/md/ui/adapter/TabSpinnerAdapter.java b/app/src/main/java/org/cnodejs/android/md/ui/adapter/TabSpinnerAdapter.java new file mode 100644 index 00000000..cb22a1c0 --- /dev/null +++ b/app/src/main/java/org/cnodejs/android/md/ui/adapter/TabSpinnerAdapter.java @@ -0,0 +1,84 @@ +package org.cnodejs.android.md.ui.adapter; + +import android.content.Context; +import android.support.annotation.LayoutRes; +import android.support.annotation.NonNull; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.TextView; + +import org.cnodejs.android.md.model.entity.Tab; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; + +public class TabSpinnerAdapter extends BaseAdapter { + + private final LayoutInflater inflater; + private final List tabList = new ArrayList<>(); + + public TabSpinnerAdapter(@NonNull Context context, @NonNull List tabList) { + inflater = LayoutInflater.from(context); + this.tabList.addAll(tabList); + } + + @Override + public int getCount() { + return tabList.size(); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public Object getItem(int position) { + return tabList.get(position); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + return createOrUpdateViewFromResource(position, convertView, parent, android.R.layout.simple_spinner_item); + } + + @Override + public View getDropDownView(int position, View convertView, ViewGroup parent) { + return createOrUpdateViewFromResource(position, convertView, parent, android.R.layout.simple_spinner_dropdown_item); + } + + @NonNull + private View createOrUpdateViewFromResource(int position, View convertView, ViewGroup parent, @LayoutRes int layoutId) { + ViewHolder holder; + if (convertView == null) { + convertView = inflater.inflate(layoutId, parent, false); + holder = new ViewHolder(convertView); + convertView.setTag(holder); + } else { + holder = (ViewHolder) convertView.getTag(); + } + holder.update(tabList.get(position)); + return convertView; + } + + class ViewHolder { + + @BindView(android.R.id.text1) + TextView tvText; + + ViewHolder(@NonNull View itemView) { + ButterKnife.bind(this, itemView); + } + + void update(@NonNull Tab tab) { + tvText.setText(tab.getNameId()); + } + + } + +} diff --git a/app/src/main/java/org/cnodejs/android/md/ui/view/IMainView.java b/app/src/main/java/org/cnodejs/android/md/ui/view/IMainView.java index f339c54f..4a31ffd8 100644 --- a/app/src/main/java/org/cnodejs/android/md/ui/view/IMainView.java +++ b/app/src/main/java/org/cnodejs/android/md/ui/view/IMainView.java @@ -2,14 +2,14 @@ import android.support.annotation.NonNull; -import org.cnodejs.android.md.model.entity.TabType; +import org.cnodejs.android.md.model.entity.Tab; import org.cnodejs.android.md.model.entity.Topic; import java.util.List; public interface IMainView { - void onSwitchTabOk(@NonNull TabType tab); + void onSwitchTabOk(@NonNull Tab tab); void onRefreshTopicListOk(@NonNull List topicList); diff --git a/app/src/main/res/drawable-xxxhdpi/ic_bug_report_grey600_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_bug_report_grey600_24dp.png new file mode 100644 index 00000000..98c7e7df Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_bug_report_grey600_24dp.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_bug_report_theme_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_bug_report_theme_24dp.png new file mode 100644 index 00000000..77868a16 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_bug_report_theme_24dp.png differ diff --git a/app/src/main/res/drawable/main_nav_ic_dev.xml b/app/src/main/res/drawable/main_nav_ic_dev.xml new file mode 100644 index 00000000..785d53d1 --- /dev/null +++ b/app/src/main/res/drawable/main_nav_ic_dev.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/layout/activity_create_topic.xml b/app/src/main/res/layout/activity_create_topic.xml index 43dcd839..20ef4121 100644 --- a/app/src/main/res/layout/activity_create_topic.xml +++ b/app/src/main/res/layout/activity_create_topic.xml @@ -50,8 +50,7 @@ + android:layout_height="@dimen/app_bar_size" /> diff --git a/app/src/main/res/layout/activity_main_nav.xml b/app/src/main/res/layout/activity_main_nav.xml index 42c93d1e..3ef1ecae 100644 --- a/app/src/main/res/layout/activity_main_nav.xml +++ b/app/src/main/res/layout/activity_main_nav.xml @@ -137,6 +137,12 @@ android:drawableLeft="@drawable/main_nav_ic_job" android:text="@string/tab_job" /> + + - - - - @string/tab_share - @string/tab_ask - @string/tab_job - - - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ff60ad38..a7875ff1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -9,9 +9,11 @@ 置顶 全部 精华 + 未知 分享 问答 招聘 + 测试 消息 设置