From 9178a17fda334ae4fb1df7ddefcdae9bbc40400b Mon Sep 17 00:00:00 2001 From: Administrator <123> Date: Sat, 06 Nov 2021 00:42:38 +0000 Subject: [PATCH] 广场 控制层 大厅 分类弹框 --- app/src/main/java/com/duqing/missions/ui/main/hall/popup/HallClassifyAdapter.java | 28 ++++ app/src/main/java/com/duqing/missions/ui/main/hall/SubHallFragment.java | 18 ++ app/src/main/java/com/duqing/missions/ui/main/hall/popup/HallClassifyViewModel.java | 11 + app/src/main/java/com/duqing/missions/ui/main/home/adapter/HomeClassifyAdapter.java | 2 app/src/main/java/com/duqing/missions/ui/main/dynamic/DynamicFragment.java | 8 app/src/main/res/layout/fragment_sub_hall.xml | 153 ++++++++++++--------- app/src/main/java/com/duqing/missions/base/activities/BaseTitleBarActivity.java | 1 app/src/main/java/com/duqing/missions/ui/main/dynamic/square/SquareAdapter.java | 14 ++ app/src/main/java/com/duqing/missions/ui/main/home/HomeFragment.java | 8 app/src/main/java/com/duqing/missions/ui/main/dynamic/square/SquareFragment.java | 14 ++ app/src/main/res/layout/hall_popu_classify.xml | 66 ++++++++- app/src/main/java/com/duqing/missions/ui/main/dynamic/square/SquareViewModel.java | 19 ++ app/src/main/java/com/duqing/missions/ui/main/hall/popup/PopupClassify.java | 39 +++++ 13 files changed, 293 insertions(+), 88 deletions(-) diff --git a/app/src/main/java/com/duqing/missions/base/activities/BaseTitleBarActivity.java b/app/src/main/java/com/duqing/missions/base/activities/BaseTitleBarActivity.java index dab729e..43339d5 100644 --- a/app/src/main/java/com/duqing/missions/base/activities/BaseTitleBarActivity.java +++ b/app/src/main/java/com/duqing/missions/base/activities/BaseTitleBarActivity.java @@ -23,6 +23,7 @@ try { titleBarView = (TitleBarView) binding.getClass().getDeclaredField("titleBar").get(binding); + titleBarView.setLeftClick(v -> onTitleLeftClick()); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { diff --git a/app/src/main/java/com/duqing/missions/ui/main/dynamic/DynamicFragment.java b/app/src/main/java/com/duqing/missions/ui/main/dynamic/DynamicFragment.java index 2411e7d..aabf143 100644 --- a/app/src/main/java/com/duqing/missions/ui/main/dynamic/DynamicFragment.java +++ b/app/src/main/java/com/duqing/missions/ui/main/dynamic/DynamicFragment.java @@ -4,7 +4,7 @@ import com.duqing.missions.base.fragments.BaseFragment; import com.duqing.missions.base.fragments.BaseTabFragment; import com.duqing.missions.databinding.LayoutTabViewpagerBinding; -import com.duqing.missions.ui.main.hall.SubHallFragment; +import com.duqing.missions.ui.main.dynamic.square.SquareFragment; import java.util.ArrayList; import java.util.Arrays; @@ -30,9 +30,9 @@ @Override protected List<BaseFragment> initFragments() { List<BaseFragment> list = new ArrayList<>(); - list.add(new SubHallFragment()); - list.add(new SubHallFragment()); - list.add(new SubHallFragment()); + list.add(new SquareFragment()); + list.add(new SquareFragment()); + list.add(new SquareFragment()); return list; } } diff --git a/app/src/main/java/com/duqing/missions/ui/main/dynamic/square/SquareAdapter.java b/app/src/main/java/com/duqing/missions/ui/main/dynamic/square/SquareAdapter.java new file mode 100644 index 0000000..1c31794 --- /dev/null +++ b/app/src/main/java/com/duqing/missions/ui/main/dynamic/square/SquareAdapter.java @@ -0,0 +1,14 @@ +package com.duqing.missions.ui.main.dynamic.square; + +import com.duqing.missions.base.adapter.BaseAdapter; +import com.duqing.missions.databinding.DynamicItemSquareBinding; + +/** + * 广场帖子 + * Created by Administrator on 2021/11/5 0005. + */ +public class SquareAdapter extends BaseAdapter<DynamicItemSquareBinding,String> { + @Override + protected void bindView(ViewBindHolder holder, String data, int position) { + } +} diff --git a/app/src/main/java/com/duqing/missions/ui/main/dynamic/square/SquareFragment.java b/app/src/main/java/com/duqing/missions/ui/main/dynamic/square/SquareFragment.java new file mode 100644 index 0000000..e59f3f5 --- /dev/null +++ b/app/src/main/java/com/duqing/missions/ui/main/dynamic/square/SquareFragment.java @@ -0,0 +1,14 @@ +package com.duqing.missions.ui.main.dynamic.square; + +import com.duqing.missions.base.fragments.BaseLoadPageFragment; +import com.duqing.missions.data.BasePageResult; +import com.duqing.missions.databinding.RefreshRecyclerBinding; + +/** + * 广场 + * Created by Administrator on 2021/11/5 0005. + */ +public class SquareFragment extends BaseLoadPageFragment<RefreshRecyclerBinding,SquareViewModel,SquareAdapter, BasePageResult<String>> { + + +} diff --git a/app/src/main/java/com/duqing/missions/ui/main/dynamic/square/SquareViewModel.java b/app/src/main/java/com/duqing/missions/ui/main/dynamic/square/SquareViewModel.java new file mode 100644 index 0000000..a577f21 --- /dev/null +++ b/app/src/main/java/com/duqing/missions/ui/main/dynamic/square/SquareViewModel.java @@ -0,0 +1,19 @@ +package com.duqing.missions.ui.main.dynamic.square; + +import com.duqing.missions.base.model.BaseLoadPageViewModel; + +/** + * 广场 + * Created by Administrator on 2021/11/5 0005. + */ +public class SquareViewModel extends BaseLoadPageViewModel { + @Override + public void onRefresh() { + + } + + @Override + public void onLoadMore() { + + } +} diff --git a/app/src/main/java/com/duqing/missions/ui/main/hall/SubHallFragment.java b/app/src/main/java/com/duqing/missions/ui/main/hall/SubHallFragment.java index c3f003e..8dfbed1 100644 --- a/app/src/main/java/com/duqing/missions/ui/main/hall/SubHallFragment.java +++ b/app/src/main/java/com/duqing/missions/ui/main/hall/SubHallFragment.java @@ -1,9 +1,14 @@ package com.duqing.missions.ui.main.hall; +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; + import com.duqing.missions.base.fragments.BaseLoadPageFragment; import com.duqing.missions.data.BasePageResult; import com.duqing.missions.databinding.FragmentSubHallBinding; -import com.duqing.missions.databinding.RefreshRecyclerBinding; +import com.duqing.missions.databinding.HallPopuClassifyBinding; +import com.duqing.missions.ui.main.hall.popup.PopupClassify; import com.duqing.missions.ui.main.home.adapter.MissionAdapter; /** @@ -11,10 +16,17 @@ */ public class SubHallFragment extends BaseLoadPageFragment<FragmentSubHallBinding,SubHallViewModel, MissionAdapter, BasePageResult<String>> { - @Override public void initViews() { super.initViews(); - final RefreshRecyclerBinding includeRefreshRecycler = binding.includeRefreshRecycler; + binding.txtClassify.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + new PopupClassify(getContext(), HallPopuClassifyBinding.inflate((LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE))).showAsDropDown(v); + } + }); } + + + } diff --git a/app/src/main/java/com/duqing/missions/ui/main/hall/popup/HallClassifyAdapter.java b/app/src/main/java/com/duqing/missions/ui/main/hall/popup/HallClassifyAdapter.java new file mode 100644 index 0000000..ab55905 --- /dev/null +++ b/app/src/main/java/com/duqing/missions/ui/main/hall/popup/HallClassifyAdapter.java @@ -0,0 +1,28 @@ +package com.duqing.missions.ui.main.hall.popup; + +import android.widget.CompoundButton; + +import com.duqing.missions.base.adapter.BaseAdapter; +import com.duqing.missions.databinding.ItemClassifyBinding; + +/** + * Created by Administrator on 2021/11/5 0005. + */ +public class HallClassifyAdapter extends BaseAdapter<ItemClassifyBinding,String> { + + + @Override + protected void bindView(ViewBindHolder holder, String data, int position) { + holder.binding.check.setText(data); + holder.binding.check.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if(isChecked){ + buttonView.setEnabled(false); + }else{ + buttonView.setEnabled(true); + } + } + }); + } +} diff --git a/app/src/main/java/com/duqing/missions/ui/main/hall/popup/HallClassifyViewModel.java b/app/src/main/java/com/duqing/missions/ui/main/hall/popup/HallClassifyViewModel.java new file mode 100644 index 0000000..e3be39b --- /dev/null +++ b/app/src/main/java/com/duqing/missions/ui/main/hall/popup/HallClassifyViewModel.java @@ -0,0 +1,11 @@ +package com.duqing.missions.ui.main.hall.popup; + +import androidx.lifecycle.ViewModel; + +/** + * Created by Administrator on 2021/11/5 0005. + */ +public class HallClassifyViewModel extends ViewModel { + + +} diff --git a/app/src/main/java/com/duqing/missions/ui/main/hall/popup/PopupClassify.java b/app/src/main/java/com/duqing/missions/ui/main/hall/popup/PopupClassify.java new file mode 100644 index 0000000..c8f7e92 --- /dev/null +++ b/app/src/main/java/com/duqing/missions/ui/main/hall/popup/PopupClassify.java @@ -0,0 +1,39 @@ +package com.duqing.missions.ui.main.hall.popup; + +import android.content.Context; +import android.view.ViewGroup; +import android.widget.PopupWindow; + +import androidx.recyclerview.widget.GridLayoutManager; + +import com.duqing.missions.databinding.HallPopuClassifyBinding; + +import java.util.ArrayList; +import java.util.Arrays; + +/** + * Created by Administrator on 2021/11/5 0005. + */ +public class PopupClassify extends PopupWindow { + + String[] classifies = new String[]{ + "注册","投票","关注","浏览", + "下载","转发","发帖","评论", + "高价","电商","实名","试玩", + "特单","砍价","其他" + }; + + + public PopupClassify(Context context,HallPopuClassifyBinding binding) { + //final HallPopuClassifyBinding binding = HallPopuClassifyBinding.inflate((LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)); + super(binding.getRoot(), ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT); + binding.recycler.setLayoutManager(new GridLayoutManager(context,4)); + HallClassifyAdapter adapter = new HallClassifyAdapter(); + adapter.setData(new ArrayList<>(Arrays.asList(classifies))); + binding.recycler.setAdapter(adapter); + setOutsideTouchable(true); + binding.textConfirm.setOnClickListener(v -> dismiss()); + binding.textCancel.setOnClickListener(v -> dismiss()); + } + +} diff --git a/app/src/main/java/com/duqing/missions/ui/main/home/HomeFragment.java b/app/src/main/java/com/duqing/missions/ui/main/home/HomeFragment.java index bc12d4b..df1092d 100644 --- a/app/src/main/java/com/duqing/missions/ui/main/home/HomeFragment.java +++ b/app/src/main/java/com/duqing/missions/ui/main/home/HomeFragment.java @@ -18,7 +18,7 @@ import com.duqing.missions.data.BasePageResult; import com.duqing.missions.databinding.FragmentHomeBinding; import com.duqing.missions.ui.login.view.LoginActivity; -import com.duqing.missions.ui.main.home.adapter.ClassifyAdapter; +import com.duqing.missions.ui.main.home.adapter.HomeClassifyAdapter; import com.duqing.missions.ui.main.home.adapter.MissionAdapter; import com.duqing.missions.ui.main.home.adapter.MissionTopAdapter; import com.duqing.missions.ui.main.home.model.Classify; @@ -41,8 +41,8 @@ LinearLayoutManager layoutManager = new LinearLayoutManager(getContext()); layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); recyclerClassify.setLayoutManager(layoutManager); - ClassifyAdapter classifyAdapter = new ClassifyAdapter(); - recyclerClassify.setAdapter(classifyAdapter); + HomeClassifyAdapter homeClassifyAdapter = new HomeClassifyAdapter(); + recyclerClassify.setAdapter(homeClassifyAdapter); recyclerTop.setLayoutManager(new GridLayoutManager(getContext(),3)); final MissionTopAdapter topAdapter = new MissionTopAdapter(); recyclerTop.setAdapter(topAdapter); @@ -63,7 +63,7 @@ viewModel.getClassifies().observeForever(new Observer<List<Classify>>() { @Override public void onChanged(List<Classify> cliassifies) { - classifyAdapter.setData(cliassifies); + homeClassifyAdapter.setData(cliassifies); } }); } diff --git a/app/src/main/java/com/duqing/missions/ui/main/home/adapter/ClassifyAdapter.java b/app/src/main/java/com/duqing/missions/ui/main/home/adapter/HomeClassifyAdapter.java similarity index 83% rename from app/src/main/java/com/duqing/missions/ui/main/home/adapter/ClassifyAdapter.java rename to app/src/main/java/com/duqing/missions/ui/main/home/adapter/HomeClassifyAdapter.java index fbc7604..7eaa99e 100644 --- a/app/src/main/java/com/duqing/missions/ui/main/home/adapter/ClassifyAdapter.java +++ b/app/src/main/java/com/duqing/missions/ui/main/home/adapter/HomeClassifyAdapter.java @@ -7,7 +7,7 @@ /** * Created by Administrator on 2021/11/5 0005. */ -public class ClassifyAdapter extends BaseAdapter<HomeItemClassifyBinding, Classify> { +public class HomeClassifyAdapter extends BaseAdapter<HomeItemClassifyBinding, Classify> { @Override protected void bindView(ViewBindHolder holder, Classify data, int position) { holder.binding.textView.setText("Text "+position); diff --git a/app/src/main/res/layout/fragment_sub_hall.xml b/app/src/main/res/layout/fragment_sub_hall.xml index 35b39a1..9938808 100644 --- a/app/src/main/res/layout/fragment_sub_hall.xml +++ b/app/src/main/res/layout/fragment_sub_hall.xml @@ -2,7 +2,8 @@ <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" - xmlns:app="http://schemas.android.com/apk/res-auto"> + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> <RadioGroup @@ -63,71 +64,91 @@ app:layout_constraintHorizontal_weight="1" app:layout_constraintHorizontal_chainStyle="spread" /> - - <androidx.constraintlayout.widget.ConstraintLayout - android:id="@+id/layout" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@drawable/bg_white_corner" - android:elevation="@dimen/small_radios" - android:layout_margin="@dimen/activity_horizontal_margin" - android:padding="@dimen/frame_margin_lr" - app:layout_constraintTop_toBottomOf="@id/radio_group" - app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintRight_toRightOf="parent" - app:layout_constraintBottom_toTopOf="@id/include_refresh_recycler"> - - - <include layout="@layout/hall_item_top" - android:id="@+id/layout_left" - android:layout_width="0dp" - android:layout_height="wrap_content" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintRight_toLeftOf="@id/layout_between"/> - <include layout="@layout/hall_item_top" - android:id="@+id/layout_between" - android:layout_width="0dp" - android:layout_height="wrap_content" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintLeft_toRightOf="@id/layout_left" - app:layout_constraintRight_toLeftOf="@id/layout_right" - /> - <include layout="@layout/hall_item_top" - android:id="@+id/layout_right" - android:layout_width="0dp" - android:layout_height="wrap_content" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintLeft_toRightOf="@id/layout_between" - app:layout_constraintRight_toRightOf="parent"/> - - <View - android:layout_width="0.5dp" - android:layout_height="0dp" - android:background="@color/gray" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintLeft_toRightOf="@id/layout_left" /> - - <View - android:layout_width="0.5dp" - android:layout_height="0dp" - android:background="@color/gray" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintLeft_toRightOf="@id/layout_between" /> - - - </androidx.constraintlayout.widget.ConstraintLayout> - - - <include layout="@layout/refresh_recycler" - android:id="@+id/include_refresh_recycler" + <com.scwang.smart.refresh.layout.SmartRefreshLayout + android:id="@+id/smart_refresh" android:layout_width="match_parent" android:layout_height="0dp" - app:layout_constraintTop_toBottomOf="@id/layout" - app:layout_constraintBottom_toBottomOf="parent"/> + app:layout_constraintTop_toBottomOf="@id/radio_group" + app:layout_constraintBottom_toBottomOf="parent" > + + <androidx.core.widget.NestedScrollView + android:layout_width="match_parent" + android:layout_height="match_parent"> + <androidx.constraintlayout.widget.ConstraintLayout + android:layout_width="match_parent" + android:layout_height="wrap_content"> + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/layout" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@drawable/bg_white_corner" + android:elevation="@dimen/small_radios" + android:layout_margin="@dimen/activity_horizontal_margin" + android:padding="@dimen/frame_margin_lr" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintBottom_toTopOf="@id/recycler"> + + + <include layout="@layout/hall_item_top" + android:id="@+id/layout_left" + android:layout_width="0dp" + android:layout_height="wrap_content" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toLeftOf="@id/layout_between"/> + <include layout="@layout/hall_item_top" + android:id="@+id/layout_between" + android:layout_width="0dp" + android:layout_height="wrap_content" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintLeft_toRightOf="@id/layout_left" + app:layout_constraintRight_toLeftOf="@id/layout_right" + /> + <include layout="@layout/hall_item_top" + android:id="@+id/layout_right" + android:layout_width="0dp" + android:layout_height="wrap_content" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintLeft_toRightOf="@id/layout_between" + app:layout_constraintRight_toRightOf="parent"/> + + <View + android:layout_width="0.5dp" + android:layout_height="0dp" + android:background="@color/gray" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintLeft_toRightOf="@id/layout_left" /> + + <View + android:layout_width="0.5dp" + android:layout_height="0dp" + android:background="@color/gray" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintLeft_toRightOf="@id/layout_between" /> + + + </androidx.constraintlayout.widget.ConstraintLayout> + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/recycler" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:overScrollMode="never" + android:padding="@dimen/activity_horizontal_margin" + tools:listitem="@layout/homt_item_recommend" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toBottomOf="@id/layout"/> + </androidx.constraintlayout.widget.ConstraintLayout> + </androidx.core.widget.NestedScrollView> + + </com.scwang.smart.refresh.layout.SmartRefreshLayout> + + </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/hall_popu_classify.xml b/app/src/main/res/layout/hall_popu_classify.xml index 0722bf5..f3f2c91 100644 --- a/app/src/main/res/layout/hall_popu_classify.xml +++ b/app/src/main/res/layout/hall_popu_classify.xml @@ -1,14 +1,60 @@ <?xml version="1.0" encoding="utf-8"?> -<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" +<RelativeLayout + xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" - android:id="@+id/recycler" android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@drawable/bg_border_gray_corner" - android:paddingBottom="@dimen/frame_margin_lr" - app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" - app:spanCount="4" - tools:listitem="@layout/item_classify" - tools:itemCount="8"> -</androidx.recyclerview.widget.RecyclerView> \ No newline at end of file + android:layout_height="wrap_content"> + <androidx.constraintlayout.widget.ConstraintLayout + android:layout_marginBottom="@dimen/small_radios" + android:background="@color/white" + android:elevation="@dimen/small_radios" + android:layout_width="match_parent" + android:layout_height="wrap_content"> + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/recycler" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingBottom="@dimen/frame_margin_lr" + android:overScrollMode="never" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" + app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" + app:spanCount="4" + tools:listitem="@layout/item_classify" + tools:itemCount="8"> + </androidx.recyclerview.widget.RecyclerView> + <View + android:layout_width="match_parent" + android:layout_height="0.5dp" + android:background="@color/gray" + app:layout_constraintTop_toBottomOf="@id/recycler" /> + <TextView + android:id="@+id/text_cancel" + android:layout_width="0dp" + android:layout_height="40dp" + android:text="取消" + android:gravity="center" + app:layout_constraintRight_toLeftOf="@id/text_confirm" + app:layout_constraintTop_toBottomOf="@id/recycler" + app:layout_constraintLeft_toLeftOf="parent" /> + <TextView + android:id="@+id/text_confirm" + android:layout_width="0dp" + android:layout_height="50dp" + android:text="确定" + android:gravity="center" + app:layout_constraintTop_toBottomOf="@id/recycler" + app:layout_constraintLeft_toRightOf="@id/text_cancel" + app:layout_constraintRight_toRightOf="parent"/> + <View + android:layout_width="0.5dp" + android:layout_height="0dp" + android:background="@color/gray" + app:layout_constraintTop_toTopOf="@id/text_cancel" + app:layout_constraintBottom_toBottomOf="@id/text_cancel" + app:layout_constraintLeft_toRightOf="@id/text_cancel"/> + + </androidx.constraintlayout.widget.ConstraintLayout> +</RelativeLayout> \ No newline at end of file -- Gitblit v1.9.1