From 481e22455a6337874b50501846d2f65421427355 Mon Sep 17 00:00:00 2001 From: Ming <18642047181@163.com> Date: Sat, 26 Mar 2022 01:51:48 +0800 Subject: [PATCH] =?UTF-8?q?[function]=E5=9F=BA=E7=A1=80=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 10 + app/src/main/AndroidManifest.xml | 28 +- app/src/main/java/com/skipping/Contant.kt | 12 + .../com/skipping/activity/HostActivity.java | 2 +- .../com/skipping/activity/MainActivity.java | 2 +- .../com/skipping/activity/NetActivity.java | 2 +- .../com/skipping/activity/SplashActivity.java | 75 ---- .../activity/clasz/ClassActivity.java | 2 +- .../activity/detail/DetailActivity.java | 2 +- .../activity/grade/GradeActivity.java | 3 +- .../skipping/activity/home/HomeActivity.kt | 65 ++- .../skipping/activity/home/HomeGridAdaper.kt | 61 +++ .../skipping/activity/home/HomePresenter.kt | 42 +- .../skipping/activity/list/ListActivity.java | 2 +- .../activity/perform/PerformActivity.kt | 79 ++++ .../activity/perform/PerformAdaper.kt | 47 ++ .../activity/perform/PerformPresenter.kt | 40 ++ .../activity/setting/SettingActivity.kt | 38 +- .../activity/splash/SplashActivity.kt | 60 +++ .../activity/splash/SplashPresenter.kt | 50 +++ .../com/skipping/utils/AntiShakeUtil.java | 129 ++++++ .../main/java/com/skipping/utils/DateUtils.kt | 22 + .../java/com/skipping/utils/ErrorToken.java | 4 +- .../com/skipping/utils/StatusBarUtil.java | 194 ++++++++ .../view/bubblewindow/BubbleWindow.java | 417 ++++++++++++++++++ .../skipping/view/bubblewindow/Direction.java | 18 + .../view/bubblewindow/OnItemClick.java | 10 + .../com/skipping/view/bubblewindow/Theme.java | 17 + .../bubblewindow/itemview/BaseItemView.java | 23 + .../itemview/ImageTextItemView.java | 40 ++ .../bubblewindow/itemview/TextItemView.java | 30 ++ .../drawable/bubblewindow_angle_bottom.xml | 16 + .../bubblewindow_angle_bottom_clicked.xml | 16 + .../bubblewindow_angle_bottom_dark.xml | 16 + .../bubblewindow_angle_bottom_selector.xml | 5 + .../res/drawable/bubblewindow_angle_top.xml | 16 + .../bubblewindow_angle_top_clicked.xml | 16 + .../drawable/bubblewindow_angle_top_dark.xml | 16 + .../bubblewindow_angle_top_selector.xml | 5 + .../res/drawable/bubblewindow_background.xml | 5 + .../drawable/bubblewindow_background_dark.xml | 5 + .../drawable/bubblewindow_bottom_selector.xml | 5 + .../drawable/bubblewindow_center_selector.xml | 5 + .../res/drawable/bubblewindow_item_bottom.xml | 7 + .../bubblewindow_item_bottom_clicked.xml | 7 + .../bubblewindow_item_bottom_dark.xml | 7 + .../res/drawable/bubblewindow_item_center.xml | 4 + .../bubblewindow_item_center_clicked.xml | 4 + .../bubblewindow_item_center_dark.xml | 4 + .../drawable/bubblewindow_item_clicked.xml | 5 + .../res/drawable/bubblewindow_item_top.xml | 7 + .../bubblewindow_item_top_clicked.xml | 7 + .../drawable/bubblewindow_item_top_dark.xml | 7 + .../drawable/bubblewindow_one_selector.xml | 5 + .../drawable/bubblewindow_top_selector.xml | 5 + app/src/main/res/drawable/cancel.xml | 9 + app/src/main/res/drawable/grid_chengji.xml | 5 + app/src/main/res/drawable/grid_item_bg.xml | 5 + app/src/main/res/drawable/grid_left.xml | 8 + app/src/main/res/drawable/grid_right.xml | 5 + app/src/main/res/drawable/ic_menu_camera.xml | 12 + app/src/main/res/drawable/ic_menu_gallery.xml | 9 + .../main/res/drawable/ic_menu_slideshow.xml | 9 + app/src/main/res/drawable/left_clicked.xml | 7 + app/src/main/res/drawable/left_unclicked.xml | 9 + app/src/main/res/drawable/ok.xml | 6 + app/src/main/res/drawable/right_clicked.xml | 7 + app/src/main/res/drawable/right_unclicked.xml | 9 + app/src/main/res/drawable/side_nav_bar.xml | 9 + app/src/main/res/drawable/splash_preview.xml | 2 +- app/src/main/res/layout/activity_home.xml | 343 ++++++++++++-- app/src/main/res/layout/activity_perform.xml | 204 +++++++++ .../res/layout/bubble_item_layout_imgtext.xml | 26 ++ .../res/layout/bubble_item_layout_text.xml | 19 + app/src/main/res/layout/bubble_layout.xml | 44 ++ app/src/main/res/layout/grid_item.xml | 149 +++++++ app/src/main/res/layout/perform_item.xml | 37 ++ app/src/main/res/mipmap-mdpi/down.png | Bin 0 -> 375 bytes app/src/main/res/mipmap-xhdpi/down.png | Bin 0 -> 375 bytes app/src/main/res/mipmap-xhdpi/right.png | Bin 0 -> 472 bytes app/src/main/res/mipmap-xxhdpi/down.png | Bin 0 -> 375 bytes app/src/main/res/mipmap-xxhdpi/right.png | Bin 0 -> 472 bytes app/src/main/res/mipmap-xxxhdpi/down.png | Bin 0 -> 375 bytes app/src/main/res/mipmap-xxxhdpi/right.png | Bin 0 -> 472 bytes app/src/main/res/values/colors.xml | 6 +- app/src/main/res/values/dimens.xml | 8 + app/src/main/res/values/strings.xml | 11 + app/src/main/res/values/styles.xml | 8 + app/src/main/res/values/themes.xml | 9 + build.gradle | 3 + .../java/com/libs/fragment/BaseActivity.java | 13 +- .../main/java/com/libs/network/Concise.java | 4 - 92 files changed, 2567 insertions(+), 149 deletions(-) delete mode 100644 app/src/main/java/com/skipping/activity/SplashActivity.java create mode 100644 app/src/main/java/com/skipping/activity/home/HomeGridAdaper.kt create mode 100644 app/src/main/java/com/skipping/activity/perform/PerformActivity.kt create mode 100644 app/src/main/java/com/skipping/activity/perform/PerformAdaper.kt create mode 100644 app/src/main/java/com/skipping/activity/perform/PerformPresenter.kt create mode 100644 app/src/main/java/com/skipping/activity/splash/SplashActivity.kt create mode 100644 app/src/main/java/com/skipping/activity/splash/SplashPresenter.kt create mode 100644 app/src/main/java/com/skipping/utils/AntiShakeUtil.java create mode 100644 app/src/main/java/com/skipping/utils/DateUtils.kt create mode 100644 app/src/main/java/com/skipping/utils/StatusBarUtil.java create mode 100644 app/src/main/java/com/skipping/view/bubblewindow/BubbleWindow.java create mode 100644 app/src/main/java/com/skipping/view/bubblewindow/Direction.java create mode 100644 app/src/main/java/com/skipping/view/bubblewindow/OnItemClick.java create mode 100644 app/src/main/java/com/skipping/view/bubblewindow/Theme.java create mode 100644 app/src/main/java/com/skipping/view/bubblewindow/itemview/BaseItemView.java create mode 100644 app/src/main/java/com/skipping/view/bubblewindow/itemview/ImageTextItemView.java create mode 100644 app/src/main/java/com/skipping/view/bubblewindow/itemview/TextItemView.java create mode 100644 app/src/main/res/drawable/bubblewindow_angle_bottom.xml create mode 100644 app/src/main/res/drawable/bubblewindow_angle_bottom_clicked.xml create mode 100644 app/src/main/res/drawable/bubblewindow_angle_bottom_dark.xml create mode 100644 app/src/main/res/drawable/bubblewindow_angle_bottom_selector.xml create mode 100644 app/src/main/res/drawable/bubblewindow_angle_top.xml create mode 100644 app/src/main/res/drawable/bubblewindow_angle_top_clicked.xml create mode 100644 app/src/main/res/drawable/bubblewindow_angle_top_dark.xml create mode 100644 app/src/main/res/drawable/bubblewindow_angle_top_selector.xml create mode 100644 app/src/main/res/drawable/bubblewindow_background.xml create mode 100644 app/src/main/res/drawable/bubblewindow_background_dark.xml create mode 100644 app/src/main/res/drawable/bubblewindow_bottom_selector.xml create mode 100644 app/src/main/res/drawable/bubblewindow_center_selector.xml create mode 100644 app/src/main/res/drawable/bubblewindow_item_bottom.xml create mode 100644 app/src/main/res/drawable/bubblewindow_item_bottom_clicked.xml create mode 100644 app/src/main/res/drawable/bubblewindow_item_bottom_dark.xml create mode 100644 app/src/main/res/drawable/bubblewindow_item_center.xml create mode 100644 app/src/main/res/drawable/bubblewindow_item_center_clicked.xml create mode 100644 app/src/main/res/drawable/bubblewindow_item_center_dark.xml create mode 100644 app/src/main/res/drawable/bubblewindow_item_clicked.xml create mode 100644 app/src/main/res/drawable/bubblewindow_item_top.xml create mode 100644 app/src/main/res/drawable/bubblewindow_item_top_clicked.xml create mode 100644 app/src/main/res/drawable/bubblewindow_item_top_dark.xml create mode 100644 app/src/main/res/drawable/bubblewindow_one_selector.xml create mode 100644 app/src/main/res/drawable/bubblewindow_top_selector.xml create mode 100644 app/src/main/res/drawable/cancel.xml create mode 100644 app/src/main/res/drawable/grid_chengji.xml create mode 100644 app/src/main/res/drawable/grid_item_bg.xml create mode 100644 app/src/main/res/drawable/grid_left.xml create mode 100644 app/src/main/res/drawable/grid_right.xml create mode 100644 app/src/main/res/drawable/ic_menu_camera.xml create mode 100644 app/src/main/res/drawable/ic_menu_gallery.xml create mode 100644 app/src/main/res/drawable/ic_menu_slideshow.xml create mode 100644 app/src/main/res/drawable/left_clicked.xml create mode 100644 app/src/main/res/drawable/left_unclicked.xml create mode 100644 app/src/main/res/drawable/ok.xml create mode 100644 app/src/main/res/drawable/right_clicked.xml create mode 100644 app/src/main/res/drawable/right_unclicked.xml create mode 100644 app/src/main/res/drawable/side_nav_bar.xml create mode 100644 app/src/main/res/layout/activity_perform.xml create mode 100644 app/src/main/res/layout/bubble_item_layout_imgtext.xml create mode 100644 app/src/main/res/layout/bubble_item_layout_text.xml create mode 100644 app/src/main/res/layout/bubble_layout.xml create mode 100644 app/src/main/res/layout/grid_item.xml create mode 100644 app/src/main/res/layout/perform_item.xml create mode 100644 app/src/main/res/mipmap-mdpi/down.png create mode 100644 app/src/main/res/mipmap-xhdpi/down.png create mode 100644 app/src/main/res/mipmap-xhdpi/right.png create mode 100644 app/src/main/res/mipmap-xxhdpi/down.png create mode 100644 app/src/main/res/mipmap-xxhdpi/right.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/down.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/right.png create mode 100644 app/src/main/res/values/dimens.xml diff --git a/app/build.gradle b/app/build.gradle index 84f4994..33328b7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -28,6 +28,9 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } } dependencies { @@ -36,6 +39,13 @@ dependencies { implementation 'com.google.android.material:material:1.3.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' implementation project(path: ':libs') + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + implementation 'androidx.navigation:navigation-fragment:2.3.1' + implementation 'androidx.navigation:navigation-ui:2.3.1' + implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0' + implementation 'androidx.navigation:navigation-fragment-ktx:2.3.1' + implementation 'androidx.navigation:navigation-ui-ktx:2.3.1' testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 98c71e5..f4eae2a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,11 +3,11 @@ package="com.skipping"> + - - - - + + + + + @@ -35,20 +37,26 @@ - - - - + + + + + + + + android:enabled="true" /> \ No newline at end of file diff --git a/app/src/main/java/com/skipping/Contant.kt b/app/src/main/java/com/skipping/Contant.kt index d64367d..de757a0 100644 --- a/app/src/main/java/com/skipping/Contant.kt +++ b/app/src/main/java/com/skipping/Contant.kt @@ -14,15 +14,27 @@ const val BASE_URL = "https://api.xintijiao.com/ijustjump/" const val CLASS = "class" const val GRADE = "grade" const val UNFINISHED = "未完成" + /** * 账号 */ const val ACCOUNT = "account" + /** * 密码 */ const val PASSWORD = "password" + /** * token */ const val TOKEN = "token" + +/** + * 定时计数 + */ +const val TIMING = "timing" + +const val TIMING_NAME = "定时计数(秒)" + +const val NUMBER_NAME = "定数计数(个)" diff --git a/app/src/main/java/com/skipping/activity/HostActivity.java b/app/src/main/java/com/skipping/activity/HostActivity.java index b30f11d..a156fc3 100644 --- a/app/src/main/java/com/skipping/activity/HostActivity.java +++ b/app/src/main/java/com/skipping/activity/HostActivity.java @@ -79,7 +79,7 @@ public class HostActivity extends BaseActivity { }; @Override - protected int getContentViewResId() { + protected Integer getContentViewResId() { return R.layout.activity_host; } diff --git a/app/src/main/java/com/skipping/activity/MainActivity.java b/app/src/main/java/com/skipping/activity/MainActivity.java index 8a68460..9c06515 100644 --- a/app/src/main/java/com/skipping/activity/MainActivity.java +++ b/app/src/main/java/com/skipping/activity/MainActivity.java @@ -21,7 +21,7 @@ public class MainActivity extends BaseActivity { private Button btn, btn2; @Override - protected int getContentViewResId() { + protected Integer getContentViewResId() { return R.layout.activity_main; } diff --git a/app/src/main/java/com/skipping/activity/NetActivity.java b/app/src/main/java/com/skipping/activity/NetActivity.java index 12e2298..4313d8e 100644 --- a/app/src/main/java/com/skipping/activity/NetActivity.java +++ b/app/src/main/java/com/skipping/activity/NetActivity.java @@ -42,7 +42,7 @@ public class NetActivity extends BaseActivity { private NetRecyclerAdapter adapter; private LinearLayoutManager linearLayoutManager; @Override - protected int getContentViewResId() { + protected Integer getContentViewResId() { return R.layout.activity_net; } diff --git a/app/src/main/java/com/skipping/activity/SplashActivity.java b/app/src/main/java/com/skipping/activity/SplashActivity.java deleted file mode 100644 index 9932531..0000000 --- a/app/src/main/java/com/skipping/activity/SplashActivity.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.skipping.activity; - -import android.content.Intent; -import android.view.View; -import android.widget.Button; -import android.widget.EditText; - -import com.libs.fragment.BaseActivity; -import com.libs.network.CallBack; -import com.libs.network.Concise; -import com.skipping.Contants; -import com.skipping.R; -import com.skipping.activity.grade.GradeActivity; -import com.skipping.net.API; -import com.skipping.net.BaseBean; -import com.skipping.net.TokenBean; -import com.skipping.net.TokenReqBean; -import com.tencent.mmkv.MMKV; - -/** - * @author Ming - * 3/18/22 - */ -public class SplashActivity extends BaseActivity { - private EditText key, value; - private Button login; - private Concise tokenConcise; - - @Override - protected int getContentViewResId() { - return R.layout.activity_splash; - } - - @Override - protected void initView() { - key = findViewById(R.id.key); - value = findViewById(R.id.value); - login = findViewById(R.id.login); - } - - @Override - protected void initData() { - login.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - login(); - } - }); - } - - private void login() { - tokenConcise = new Concise(Contants.BASE_URL) { - }.build(); - TokenReqBean tokenReqBean = new TokenReqBean(); - tokenReqBean.setDeviceID("466e9c"); - tokenReqBean.setLogName(key.getText().toString()); - tokenReqBean.setLogPwd(value.getText().toString()); - tokenConcise.request(SplashActivity.this, tokenConcise.api.token(tokenReqBean), new CallBack>() { - @Override - public void onSuccess(BaseBean tokenBeanBaseBean) { - MMKV kv = MMKV.defaultMMKV(); - kv.encode(Contants.ACCOUNT, key.getText().toString()); - kv.encode(Contants.PASSWORD, value.getText().toString()); - kv.encode(Contants.TOKEN, tokenBeanBaseBean.getData().getToken()); - Intent intent = new Intent(SplashActivity.this, GradeActivity.class); - startActivity(intent); - } - - @Override - public void onFailed(Throwable e) { - - } - }); - } -} diff --git a/app/src/main/java/com/skipping/activity/clasz/ClassActivity.java b/app/src/main/java/com/skipping/activity/clasz/ClassActivity.java index 928e757..2c9d03c 100644 --- a/app/src/main/java/com/skipping/activity/clasz/ClassActivity.java +++ b/app/src/main/java/com/skipping/activity/clasz/ClassActivity.java @@ -31,7 +31,7 @@ public class ClassActivity extends BaseActivity { private ClassAdapter classAdapter; @Override - protected int getContentViewResId() { + protected Integer getContentViewResId() { return R.layout.activity_show; } diff --git a/app/src/main/java/com/skipping/activity/detail/DetailActivity.java b/app/src/main/java/com/skipping/activity/detail/DetailActivity.java index d425a82..bcc0ca6 100644 --- a/app/src/main/java/com/skipping/activity/detail/DetailActivity.java +++ b/app/src/main/java/com/skipping/activity/detail/DetailActivity.java @@ -36,7 +36,7 @@ public class DetailActivity extends BaseActivity { private ConnectManager connectManager; @Override - protected int getContentViewResId() { + protected Integer getContentViewResId() { return R.layout.activity_detail; } diff --git a/app/src/main/java/com/skipping/activity/grade/GradeActivity.java b/app/src/main/java/com/skipping/activity/grade/GradeActivity.java index 6ca3b92..98cff9d 100644 --- a/app/src/main/java/com/skipping/activity/grade/GradeActivity.java +++ b/app/src/main/java/com/skipping/activity/grade/GradeActivity.java @@ -11,7 +11,6 @@ import com.libs.network.CallBack; import com.libs.network.Concise; import com.skipping.Contants; import com.skipping.R; -import com.skipping.activity.SplashActivity; import com.skipping.activity.clasz.ClassActivity; import com.skipping.net.API; import com.skipping.net.BaseBean; @@ -31,7 +30,7 @@ public class GradeActivity extends BaseActivity { private GradeAdapter gradeAdapter; @Override - protected int getContentViewResId() { + protected Integer getContentViewResId() { return R.layout.activity_show; } diff --git a/app/src/main/java/com/skipping/activity/home/HomeActivity.kt b/app/src/main/java/com/skipping/activity/home/HomeActivity.kt index 9a3fae4..8f90433 100644 --- a/app/src/main/java/com/skipping/activity/home/HomeActivity.kt +++ b/app/src/main/java/com/skipping/activity/home/HomeActivity.kt @@ -1,11 +1,27 @@ package com.skipping.activity.home +import android.app.Activity import android.content.Intent -import android.os.Bundle +import android.widget.LinearLayout +import android.widget.TextView +import androidx.core.view.GravityCompat +import androidx.recyclerview.widget.GridLayoutManager +import com.google.android.material.navigation.NavigationView import com.libs.fragment.BaseActivity +import com.libs.utils.ActivityManager +import com.libs.utils.LogUtil import com.skipping.R +import com.skipping.activity.perform.PerformActivity import com.skipping.activity.setting.SettingActivity +import com.skipping.net.ActivityBean +import com.skipping.net.GradleBean +import com.skipping.utils.DateUtils import com.skipping.utils.ScreenUtil +import com.skipping.view.bubblewindow.BubbleWindow +import com.skipping.view.bubblewindow.Direction +import com.skipping.view.bubblewindow.OnItemClick +import com.skipping.view.bubblewindow.itemview.TextItemView +import kotlinx.android.synthetic.main.activity_detail.view.* import kotlinx.android.synthetic.main.activity_home.* /** @@ -14,6 +30,17 @@ import kotlinx.android.synthetic.main.activity_home.* * */ class HomeActivity : BaseActivity() { + lateinit var classList: List + lateinit var bubbleWindow: BubbleWindow + + companion object { + fun startHome(activity: Activity) { + val intent = Intent(activity, HomeActivity::class.java) + activity.startActivity(intent) + ActivityManager.getInstance().popActivity(activity) + } + } + override fun getContentViewResId(): Int { return R.layout.activity_home } @@ -26,10 +53,46 @@ class HomeActivity : BaseActivity() { setting_btn.setOnClickListener { startActivity(Intent(this@HomeActivity, SettingActivity::class.java)) } + create_activity.setOnClickListener { + drawerlayout.openDrawer(GravityCompat.START) + } + p.getActivityList() + p.getClassList() + choseClass.setOnClickListener { + bubbleWindow.show(chooseIV) + } } override fun initStart() { ScreenUtil.setCustomDensity(this) } + + fun showList(list: List) { + recyclerview.layoutManager = GridLayoutManager(this, 3) + val adaper = HomeGridAdaper(this, list) + adaper.setOnItemClickListener { + PerformActivity.startActivity(this, it.id.toString(), DateUtils.dealDateFormat(it.createdAt)) + } + recyclerview.adapter = adaper + } + + fun showClassList(list: List) { + classList = list + bubbleWindow = BubbleWindow.Builder(this).apply { + classList.forEach { + this.setItemView(TextItemView(this@HomeActivity, it.groupID, it.groupName + "班学生")) + } + }.setOnItemClick(object : OnItemClick { + override fun onClick(tag: String?, position: Int, bubbleWindow: BubbleWindow?) { + activityNameEdit?.setText(list[position].groupName + "班活动") + bubbleWindow?.dismiss() + } + }).setMargining(com.libs.utils.ScreenUtil.getActionBarHeight(this)) + .setDirection(Direction.BOTTOM) + .build() + + } + + } \ No newline at end of file diff --git a/app/src/main/java/com/skipping/activity/home/HomeGridAdaper.kt b/app/src/main/java/com/skipping/activity/home/HomeGridAdaper.kt new file mode 100644 index 0000000..0c93ecc --- /dev/null +++ b/app/src/main/java/com/skipping/activity/home/HomeGridAdaper.kt @@ -0,0 +1,61 @@ +package com.skipping.activity.home + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.skipping.NUMBER_NAME +import com.skipping.R +import com.skipping.TIMING +import com.skipping.TIMING_NAME +import com.skipping.net.ActivityBean +import com.skipping.utils.DateUtils + +/** + * @author Ming + * 3/25/22 + * + */ +class HomeGridAdaper(context: Context, list: List) : RecyclerView.Adapter() { + var list = list + var context = context + lateinit var onClick: (bean: ActivityBean) -> Unit + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HomeGridAdaper.Holder { + return Holder(LayoutInflater.from(context).inflate(R.layout.grid_item, parent, false)) + } + + override fun onBindViewHolder(holder: HomeGridAdaper.Holder, position: Int) { + holder.name.text = list[position].name + holder.time.text = DateUtils.dealDateFormat(list[position].createdAt) + holder.className.text = list[position].id.toString() + if (list[position].activityType == TIMING) { + holder.status.text = TIMING_NAME + } else { + holder.status.text = NUMBER_NAME + } + if (onClick != null) { + holder.itemView.setOnClickListener { onClick.invoke(list[position]) } + } + } + + override fun getItemCount(): Int { + return list.size + } + + class Holder(itemView: View) : RecyclerView.ViewHolder(itemView) { + var name = itemView.findViewById(R.id.name) + var time = itemView.findViewById(R.id.time) + var className = itemView.findViewById(R.id.className) + var status = itemView.findViewById(R.id.status) + } + + fun setOnItemClickListener(onClick: (bean: ActivityBean) -> Unit) { + this.onClick = onClick + } + + interface OnClick { + fun onClick(bean: ActivityBean) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/skipping/activity/home/HomePresenter.kt b/app/src/main/java/com/skipping/activity/home/HomePresenter.kt index a36cf5a..cb3d992 100644 --- a/app/src/main/java/com/skipping/activity/home/HomePresenter.kt +++ b/app/src/main/java/com/skipping/activity/home/HomePresenter.kt @@ -3,13 +3,53 @@ package com.skipping.activity.home import android.os.Parcel import android.os.Parcelable import com.libs.fragment.BasePresenter +import com.libs.network.CallBack +import com.libs.network.Concise +import com.libs.utils.ToastUtil +import com.skipping.ACCOUNT +import com.skipping.BASE_URL +import com.skipping.PASSWORD +import com.skipping.TOKEN import com.skipping.activity.IView +import com.skipping.net.* +import com.tencent.mmkv.MMKV /** * @author Ming * 3/24/22 * */ -class HomePresenter() :BasePresenter() { +class HomePresenter() : BasePresenter() { + val mmkv = MMKV.defaultMMKV() + val concise: Concise = object : Concise(BASE_URL) {}.addHeader("Token", mmkv?.decodeString(TOKEN)).build() as Concise + fun getActivityList() { + val bean = ActivityReqBean() + bean.index = 1 + bean.pageSize = 9 + concise.request(v, concise.api.getActivityList(bean), object : CallBack>> { + override fun onSuccess(k: BaseBean>?) { + if (k != null) { + v.showList(k.data) + } + } + + override fun onFailed(e: Throwable?) { + } + + }) + } + + fun getClassList() { + concise.request(v, concise.api.getClass(null), object : CallBack>> { + override fun onSuccess(k: BaseBean>?) { + v.showClassList(k?.data!!) + } + + override fun onFailed(e: Throwable?) { + } + + + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/skipping/activity/list/ListActivity.java b/app/src/main/java/com/skipping/activity/list/ListActivity.java index b8927d9..f352bf7 100644 --- a/app/src/main/java/com/skipping/activity/list/ListActivity.java +++ b/app/src/main/java/com/skipping/activity/list/ListActivity.java @@ -36,7 +36,7 @@ public class ListActivity extends BaseActivity { private ListAdapter listAdapter; @Override - protected int getContentViewResId() { + protected Integer getContentViewResId() { return R.layout.activity_show; } diff --git a/app/src/main/java/com/skipping/activity/perform/PerformActivity.kt b/app/src/main/java/com/skipping/activity/perform/PerformActivity.kt new file mode 100644 index 0000000..7933730 --- /dev/null +++ b/app/src/main/java/com/skipping/activity/perform/PerformActivity.kt @@ -0,0 +1,79 @@ +package com.skipping.activity.perform + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import android.widget.LinearLayout +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.LinearLayoutManager +import com.libs.fragment.BaseActivity +import com.libs.utils.ActivityManager +import com.skipping.NUMBER_NAME +import com.skipping.R +import com.skipping.TIMING +import com.skipping.TIMING_NAME +import com.skipping.activity.home.HomeActivity +import com.skipping.activity.setting.SettingActivity +import com.skipping.fragment.login.LoginFragment +import com.skipping.fragment.pair.PairFragment +import com.skipping.net.DetailActivityBean +import com.skipping.utils.ScreenUtil +import com.skipping.utils.StatusBarUtil +import kotlinx.android.synthetic.main.activity_perform.* +import kotlinx.android.synthetic.main.activity_setting.* + +/** + * @author Ming + * 3/24/22 + * + */ +class PerformActivity : BaseActivity() { + lateinit var adaper: PerformAdaper + + companion object { + val DATA = "data" + val TIME = "time" + fun startActivity(activity: Activity, data: String, time: String) { + val intent = Intent(activity, PerformActivity::class.java) + val bundle = Bundle() + bundle.putString(DATA, data) + bundle.putString(TIME, time) + intent.putExtra(DATA, bundle) + activity.startActivity(intent) + } + } + + override fun getContentViewResId(): Int { + return R.layout.activity_perform + } + + override fun initStart() { + ScreenUtil.setCustomDensity(this) + } + + override fun initView() { + initPresnter() + } + + override fun initData() { + p.getDetail(intent.getBundleExtra(DATA).getString(DATA)) + backBtn.setOnClickListener { + finish() + } + } + + fun showDetail(bean: DetailActivityBean) { + name.text = bean.activityName + if (bean.activityType == TIMING) { + type.text = TIMING_NAME + } else { + type.text = NUMBER_NAME + } + time.text = intent.getBundleExtra(DATA).getString(TIME) + recyclerview.layoutManager = LinearLayoutManager(this) + adaper = PerformAdaper(this, bean) + recyclerview.adapter = adaper + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/skipping/activity/perform/PerformAdaper.kt b/app/src/main/java/com/skipping/activity/perform/PerformAdaper.kt new file mode 100644 index 0000000..8f03e47 --- /dev/null +++ b/app/src/main/java/com/skipping/activity/perform/PerformAdaper.kt @@ -0,0 +1,47 @@ +package com.skipping.activity.perform + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.skipping.NUMBER_NAME +import com.skipping.R +import com.skipping.TIMING +import com.skipping.TIMING_NAME +import com.skipping.net.ActivityBean +import com.skipping.net.DetailActivityBean + +/** + * @author Ming + * 3/25/22 + * + */ +class PerformAdaper(context: Context, bean: DetailActivityBean) : RecyclerView.Adapter() { + var bean = bean + var context = context + lateinit var onClick: () -> Unit + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PerformAdaper.Holder { + return Holder(LayoutInflater.from(context).inflate(R.layout.perform_item, parent, false)) + } + + override fun onBindViewHolder(holder: PerformAdaper.Holder, position: Int) { + holder.name.text = bean.candidates[0].get(position).name + holder.code.text = bean.candidates[0].get(position).studentID + holder.time.text = bean.activityValue.toString() + holder.num.text = bean.candidates[0].get(position).score.toString() + + } + + override fun getItemCount(): Int { + return bean.candidates[0].size + } + + class Holder(itemView: View) : RecyclerView.ViewHolder(itemView) { + var name = itemView.findViewById(R.id.name) + var code = itemView.findViewById(R.id.code) + var time = itemView.findViewById(R.id.time) + var num = itemView.findViewById(R.id.num) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/skipping/activity/perform/PerformPresenter.kt b/app/src/main/java/com/skipping/activity/perform/PerformPresenter.kt new file mode 100644 index 0000000..67d88e3 --- /dev/null +++ b/app/src/main/java/com/skipping/activity/perform/PerformPresenter.kt @@ -0,0 +1,40 @@ +package com.skipping.activity.perform + +import android.os.Parcel +import android.os.Parcelable +import com.libs.fragment.BasePresenter +import com.libs.network.CallBack +import com.libs.network.Concise +import com.skipping.BASE_URL +import com.skipping.TOKEN +import com.skipping.activity.IView +import com.skipping.net.API +import com.skipping.net.ActivityBean +import com.skipping.net.BaseBean +import com.skipping.net.DetailActivityBean +import com.tencent.mmkv.MMKV + +/** + * @author Ming + * 3/24/22 + * + */ +class PerformPresenter() : BasePresenter() { + val mmkv = MMKV.defaultMMKV() + val concise: Concise = object : Concise(BASE_URL) {}.addHeader("Token", mmkv?.decodeString(TOKEN)).build() as Concise + + + fun getDetail(id: String) { + concise.request(v, concise.api.detailActivity(id), object : CallBack> { + override fun onSuccess(k: BaseBean?) { + v.showDetail(k?.data!!) + } + + override fun onFailed(e: Throwable?) { + + } + + }) + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/skipping/activity/setting/SettingActivity.kt b/app/src/main/java/com/skipping/activity/setting/SettingActivity.kt index 6094129..b5baa9b 100644 --- a/app/src/main/java/com/skipping/activity/setting/SettingActivity.kt +++ b/app/src/main/java/com/skipping/activity/setting/SettingActivity.kt @@ -1,10 +1,17 @@ package com.skipping.activity.setting +import android.app.Activity +import android.content.Intent +import android.os.Bundle import androidx.fragment.app.Fragment import com.libs.fragment.BaseActivity +import com.libs.utils.ActivityManager import com.skipping.R +import com.skipping.activity.home.HomeActivity import com.skipping.fragment.login.LoginFragment import com.skipping.fragment.pair.PairFragment +import com.skipping.utils.ScreenUtil +import com.skipping.utils.StatusBarUtil import kotlinx.android.synthetic.main.activity_setting.* /** @@ -16,15 +23,37 @@ class SettingActivity : BaseActivity() { var position = -1; lateinit var fragment: Fragment + + companion object { + val DATA = "data" + fun startActivity(activity: Activity, data: String) { + val intent = Intent(activity, SettingActivity::class.java) + val bundle = Bundle() + bundle.putString(data, data) + intent.putExtra(data, bundle) + activity.startActivity(intent) + ActivityManager.getInstance().popActivity(activity) + } + } + override fun getContentViewResId(): Int { return R.layout.activity_setting } + override fun initStart() { + ScreenUtil.setCustomDensity(this) + } + override fun initView() { + initPresnter() } override fun initData() { - clickPair() + if (intent.getBundleExtra(DATA) != null) { + clickLogin() + } else { + clickPair() + } pair.setOnClickListener { clickPair() } @@ -32,11 +61,11 @@ class SettingActivity : BaseActivity() { clickLogin() } back.setOnClickListener { - finish() + HomeActivity.startHome(this) } } - private fun clickPair(){ + private fun clickPair() { if (position == 0) { return } @@ -46,7 +75,7 @@ class SettingActivity : BaseActivity() { showFragment() } - private fun clickLogin(){ + private fun clickLogin() { if (position == 1) { return } @@ -65,4 +94,5 @@ class SettingActivity : BaseActivity() { } supportFragmentManager.beginTransaction().replace(R.id.fragment, fragment).commitAllowingStateLoss(); } + } \ No newline at end of file diff --git a/app/src/main/java/com/skipping/activity/splash/SplashActivity.kt b/app/src/main/java/com/skipping/activity/splash/SplashActivity.kt new file mode 100644 index 0000000..8bbe6b6 --- /dev/null +++ b/app/src/main/java/com/skipping/activity/splash/SplashActivity.kt @@ -0,0 +1,60 @@ +package com.skipping.activity.splash + +import android.content.Intent +import android.os.Bundle +import android.view.Window +import android.view.WindowManager +import com.libs.fragment.BaseActivity +import com.libs.utils.ActivityManager +import com.skipping.ACCOUNT +import com.skipping.PASSWORD +import com.skipping.activity.home.HomeActivity +import com.skipping.activity.setting.SettingActivity +import com.skipping.utils.ScreenUtil +import com.skipping.utils.StatusBarUtil +import com.skipping.utils.ThreadPoolUtil +import com.tencent.mmkv.MMKV + + +/** + * @author Ming + * 3/25/22 + * + */ +class SplashActivity : BaseActivity() { + override fun getContentViewResId(): Int? { + return null + } + + override fun initStart() { + requestWindowFeature(Window.FEATURE_NO_TITLE) + ScreenUtil.setCustomDensity(this) + } + + override fun initView() { + initPresnter() + window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) + StatusBarUtil.StatusBarLightMode(this) + } + + override fun initData() { + ThreadPoolUtil.getSingleton().scheduleMain({ + val mmkv = MMKV.defaultMMKV() + if (mmkv?.decodeString(ACCOUNT) == null || mmkv?.decodeString(PASSWORD) == null) { + SettingActivity.startActivity(this, "1") + } else { + p.login(mmkv.decodeString(ACCOUNT)!!, mmkv.decodeString(PASSWORD)!!) + } + }, 1500) + } + + fun loginResult(result: Int) { + if (result == 0) { + SettingActivity.startActivity(this, "1") + } else { + startActivity(Intent(this@SplashActivity, HomeActivity::class.java)) + ActivityManager.getInstance().popActivity(this) + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/skipping/activity/splash/SplashPresenter.kt b/app/src/main/java/com/skipping/activity/splash/SplashPresenter.kt new file mode 100644 index 0000000..fa00fe1 --- /dev/null +++ b/app/src/main/java/com/skipping/activity/splash/SplashPresenter.kt @@ -0,0 +1,50 @@ +package com.skipping.activity.splash + +import android.os.Parcel +import android.os.Parcelable +import com.libs.fragment.BasePresenter +import com.libs.network.CallBack +import com.libs.network.Concise +import com.libs.utils.ToastUtil +import com.skipping.ACCOUNT +import com.skipping.BASE_URL +import com.skipping.PASSWORD +import com.skipping.TOKEN +import com.skipping.activity.IView +import com.skipping.net.API +import com.skipping.net.BaseBean +import com.skipping.net.TokenBean +import com.skipping.net.TokenReqBean +import com.tencent.mmkv.MMKV + +/** + * @author Ming + * 3/24/22 + * + */ +class SplashPresenter() :BasePresenter() { + + fun login(key: String, value: String) { + val tokenConcise: Concise = object : Concise(BASE_URL) {}.build() as Concise + val tokenReqBean = TokenReqBean() + tokenReqBean.deviceID = "466e9c" + tokenReqBean.logName = key + tokenReqBean.logPwd = value + tokenConcise.request(v, tokenConcise.api.token(tokenReqBean), object : CallBack> { + override fun onSuccess(k: BaseBean?) { + val mmkv = MMKV.defaultMMKV() + mmkv?.encode(ACCOUNT, key) + mmkv?.encode(PASSWORD, value) + mmkv?.encode(TOKEN, k?.data?.token) + v.loginResult(1) + } + + override fun onFailed(e: Throwable?) { + v.loginResult(0) + ToastUtil.longToast("连接失败") + } + + }) + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/skipping/utils/AntiShakeUtil.java b/app/src/main/java/com/skipping/utils/AntiShakeUtil.java new file mode 100644 index 0000000..121e08b --- /dev/null +++ b/app/src/main/java/com/skipping/utils/AntiShakeUtil.java @@ -0,0 +1,129 @@ +package com.skipping.utils; + +import android.util.LruCache; +import android.view.View; + +import androidx.annotation.IntDef; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Created by Ming + * 2020-07-21 + * 按键防抖工具类 + */ +public class AntiShakeUtil { + private static LruCache clickCache = new LruCache<>(5); + + /** + * 按键防抖(通过监听设置) + * + * @param view 防抖的view + * @param onClickListener 点击监听 + */ + public static void setAntiShake(@NonNull View view, @Nullable OnClickListener onClickListener) { + antiShakeInternal(view, onClickListener, Type.DEFAULT, 0); + } + + /** + * 按键防抖(通过监听设置) + * + * @param view 防抖的view + * @param clickGapTime 间隔时间 + * @param onClickListener 点击监听 + */ + public static void setAntiShake(@NonNull View view, @NonNull long clickGapTime, @Nullable OnClickListener onClickListener) { + antiShakeInternal(view, onClickListener, Type.CUSTOMIZE, clickGapTime); + } + + /** + * 按键防抖传入view判断是否可点击 + * + * @param view 防抖的view + * @return true为可点击 false为不可点击 + */ + public static boolean getAntiShakeStateByView(View view) { + return getAntiShakeStateInternal(view.getId(), Type.DEFAULT, 0); + } + + /** + * 按键防抖传入view判断是否可点击 + * + * @param view 防抖的view + * @param clickGapTime 间隔时间 + * @return true为可点击 false为不可点击 + */ + public static boolean getAntiShakeStateByView(View view, long clickGapTime) { + return getAntiShakeStateInternal(view.getId(), Type.CUSTOMIZE, clickGapTime); + } + + /** + * 按键防抖传入viewId判断是否可点击 + * + * @param viewId 防抖的view的Id + * @return true为可点击 false为不可点击 + */ + public static boolean getAntiShakeStateById(int viewId) { + return getAntiShakeStateInternal(viewId, Type.DEFAULT, 0); + } + + /** + * 按键防抖传入viewId判断是否可点击 + * + * @param viewId 防抖的view的Id + * @param clickGapTime 间隔时间 + * @return true为可点击 false为不可点击 + */ + public static boolean getAntiShakeStateById(int viewId, long clickGapTime) { + return getAntiShakeStateInternal(viewId, Type.CUSTOMIZE, clickGapTime); + } + + private static boolean getAntiShakeStateInternal(int viewId, @Type int type, long clickGapTime) { + long gapTime = 500; + if (type == Type.CUSTOMIZE) { + gapTime = clickGapTime; + } + if (clickCache.get(viewId) == null) { + clickCache.put(viewId, System.currentTimeMillis()); + return true; + } else { + if ((System.currentTimeMillis() - clickCache.get(viewId) > gapTime)) { + clickCache.put(viewId, System.currentTimeMillis()); + return true; + } else { + return false; + } + } + } + + private static void antiShakeInternal(View view, OnClickListener onClickListener, @Type int type, long clickGapTime) { + long gapTime = 500; + if (type == Type.CUSTOMIZE) { + gapTime = clickGapTime; + } + final long[] lastClickTimeStamp = {0}; + if (onClickListener != null) { + long finalGapTime = gapTime; + view.setOnClickListener(v -> { + if ((System.currentTimeMillis() - lastClickTimeStamp[0]) > finalGapTime) { + lastClickTimeStamp[0] = System.currentTimeMillis(); + onClickListener.onClick(); + } + }); + } + } + + @Retention(RetentionPolicy.SOURCE) + @IntDef({Type.DEFAULT, Type.CUSTOMIZE}) + private @interface Type { + int DEFAULT = 0; + int CUSTOMIZE = 1; + } + + public interface OnClickListener { + void onClick(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/skipping/utils/DateUtils.kt b/app/src/main/java/com/skipping/utils/DateUtils.kt new file mode 100644 index 0000000..6d0a7e4 --- /dev/null +++ b/app/src/main/java/com/skipping/utils/DateUtils.kt @@ -0,0 +1,22 @@ +package com.skipping.utils + +import java.text.DateFormat +import java.text.SimpleDateFormat +import java.util.* + +/** + * @author Ming + * 3/26/22 + * + */ +class DateUtils { + companion object { + fun dealDateFormat(oldDateStr: String): String { + var df: DateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ") + val date: Date = df.parse(oldDateStr) + val df2: DateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + return df2.format(date) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/skipping/utils/ErrorToken.java b/app/src/main/java/com/skipping/utils/ErrorToken.java index a8b4333..3d20774 100644 --- a/app/src/main/java/com/skipping/utils/ErrorToken.java +++ b/app/src/main/java/com/skipping/utils/ErrorToken.java @@ -5,9 +5,7 @@ import android.content.Intent; import com.libs.network.Concise; import com.libs.network.interceptor.ErrorCodeCallBack; -import com.skipping.Contants; -import com.skipping.activity.SplashActivity; -import com.skipping.net.API; +import com.skipping.activity.splash.SplashActivity; /** * @author Ming diff --git a/app/src/main/java/com/skipping/utils/StatusBarUtil.java b/app/src/main/java/com/skipping/utils/StatusBarUtil.java new file mode 100644 index 0000000..f648c63 --- /dev/null +++ b/app/src/main/java/com/skipping/utils/StatusBarUtil.java @@ -0,0 +1,194 @@ +package com.skipping.utils; + +import android.annotation.TargetApi; +import android.app.Activity; +import android.graphics.Color; +import android.os.Build; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; + + +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +/** + * Created by Ming + * 2020-09-15 + */ +public class StatusBarUtil { + /** + * 修改状态栏为全透明 + * + * @param activity + */ + @TargetApi(19) + public static void transparencyBar(Activity activity) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + Window window = activity.getWindow(); + window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.setStatusBarColor(Color.TRANSPARENT); + + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + Window window = activity.getWindow(); + window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, + WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + } + } + + /** + * 修改状态栏颜色,支持4.4以上版本 + * + * @param activity + * @param colorId + */ +// public static void setStatusBarColor(Activity activity, int colorId) { +// +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { +// Window window = activity.getWindow(); +//// window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); +// window.setStatusBarColor(activity.getResources().getColor(colorId)); +// } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { +// //使用SystemBarTint库使4.4版本状态栏变色,需要先将状态栏设置为透明 +// transparencyBar(activity); +// SystemBarTintManager tintManager = new SystemBarTintManager(activity); +// tintManager.setStatusBarTintEnabled(true); +// tintManager.setStatusBarTintResource(colorId); +// } +// } + + /** + * 状态栏亮色模式,设置状态栏黑色文字、图标, + * 适配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android + * + * @param activity + * @return 1:MIUUI 2:Flyme 3:android6.0 + */ + public static int StatusBarLightMode(Activity activity) { + int result = 0; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + if (MIUISetStatusBarLightMode(activity, true)) { + result = 1; + } else if (FlymeSetStatusBarLightMode(activity.getWindow(), true)) { + result = 2; + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + result = 3; + } + } + return result; + } + + /** + * 已知系统类型时,设置状态栏黑色文字、图标。 + * 适配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android + * + * @param activity + * @param type 1:MIUUI 2:Flyme 3:android6.0 + */ + public static void StatusBarLightMode(Activity activity, int type) { + if (type == 1) { + MIUISetStatusBarLightMode(activity, true); + } else if (type == 2) { + FlymeSetStatusBarLightMode(activity.getWindow(), true); + } else if (type == 3) { + activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } + + } + + /** + * 状态栏暗色模式,清除MIUI、flyme或6.0以上版本状态栏黑色文字、图标 + */ + public static void StatusBarDarkMode(Activity activity, int type) { + if (type == 1) { + MIUISetStatusBarLightMode(activity, false); + } else if (type == 2) { + FlymeSetStatusBarLightMode(activity.getWindow(), false); + } else if (type == 3) { + activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); + } + + } + + + /** + * 设置状态栏图标为深色和魅族特定的文字风格 + * 可以用来判断是否为Flyme用户 + * + * @param window 需要设置的窗口 + * @param dark 是否把状态栏文字及图标颜色设置为深色 + * @return boolean 成功执行返回true + */ + public static boolean FlymeSetStatusBarLightMode(Window window, boolean dark) { + boolean result = false; + if (window != null) { + try { + WindowManager.LayoutParams lp = window.getAttributes(); + Field darkFlag = WindowManager.LayoutParams.class + .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON"); + Field meizuFlags = WindowManager.LayoutParams.class + .getDeclaredField("meizuFlags"); + darkFlag.setAccessible(true); + meizuFlags.setAccessible(true); + int bit = darkFlag.getInt(null); + int value = meizuFlags.getInt(lp); + if (dark) { + value |= bit; + } else { + value &= ~bit; + } + meizuFlags.setInt(lp, value); + window.setAttributes(lp); + result = true; + } catch (Exception e) { + + } + } + return result; + } + + /** + * 需要MIUIV6以上 + * + * @param activity + * @param dark 是否把状态栏文字及图标颜色设置为深色 + * @return boolean 成功执行返回true + */ + public static boolean MIUISetStatusBarLightMode(Activity activity, boolean dark) { + boolean result = false; + Window window = activity.getWindow(); + if (window != null) { + Class clazz = window.getClass(); + try { + int darkModeFlag = 0; + Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams"); + Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE"); + darkModeFlag = field.getInt(layoutParams); + Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class); + if (dark) { + extraFlagField.invoke(window, darkModeFlag, darkModeFlag);//状态栏透明且黑色字体 + } else { + extraFlagField.invoke(window, 0, darkModeFlag);//清除黑色字体 + } + result = true; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + //开发版 7.7.13 及以后版本采用了系统API,旧方法无效但不会报错,所以两个方式都要加上 + if (dark) { + activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } else { + activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); + } + } + } catch (Exception e) { + + } + } + return result; + } + +} diff --git a/app/src/main/java/com/skipping/view/bubblewindow/BubbleWindow.java b/app/src/main/java/com/skipping/view/bubblewindow/BubbleWindow.java new file mode 100644 index 0000000..687c398 --- /dev/null +++ b/app/src/main/java/com/skipping/view/bubblewindow/BubbleWindow.java @@ -0,0 +1,417 @@ +package com.skipping.view.bubblewindow; + +import android.app.Activity; +import android.app.AlertDialog; +import android.view.Gravity; +import android.view.MotionEvent; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.LinearLayout; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.content.ContextCompat; + +import com.libs.utils.ScreenUtil; +import com.skipping.R; +import com.skipping.utils.AntiShakeUtil; +import com.skipping.view.bubblewindow.itemview.BaseItemView; + +import java.util.ArrayList; +import java.util.List; + + +/** + * Created by Ming + * 2020-08-11 + * 气泡弹窗 + * todo 判断点击范围 出范围抬起时没有点击效果 + */ +public class BubbleWindow { + private List baseItemViewList = new ArrayList<>(); + private OnItemClick onItemClick; + private View clickView; + /** + * 弹窗宽度 + */ + private static int dialogWidth = 150; + + private AlertDialog dialog; + private Activity context; + private View angleView; + + /** + * 弹窗方向 默认向下 + */ + private int direction = Direction.TOP; + + /** + * 弹窗距离屏幕边距 + */ + private int padding = 20; + + /** + * 弹出的view距离 + */ + private int marging = 0; + + /** + * 点击selector + */ + private boolean selector = true; + + /** + * 主题颜色 + */ + private @Theme + int theme = Theme.LIGHT; + + public static class Builder { + private BubbleWindow bubbleWindow; + + public Builder(Activity context) { + bubbleWindow = new BubbleWindow(); + bubbleWindow.context = context; + } + + //弹窗距离屏幕距离 + public Builder setPadding(int padding) { + bubbleWindow.padding = padding; + return this; + } + + //弹窗距离弹出的view距离 + public Builder setMargining(int marging) { + bubbleWindow.marging = marging; + return this; + } + + //弹窗方向 + public Builder setDirection(@Direction int direction) { + bubbleWindow.direction = direction; + return this; + } + + //添加子item + public Builder setItemView(BaseItemView itemView) { + itemView.setView(); + bubbleWindow.baseItemViewList.add(itemView); + return this; + } + + //弹窗item点击事件 + public Builder setOnItemClick(OnItemClick onItemClick) { + bubbleWindow.onItemClick = onItemClick; + return this; + } + + //弹窗主题白色黑色 + public Builder setTheme(@Theme int theme) { + bubbleWindow.theme = theme; + return this; + } + + //弹窗点击selector + public Builder setSelector(Boolean selector) { + bubbleWindow.selector = selector; + return this; + } + + public BubbleWindow build() { + bubbleWindow.setBubbleWindow(); + return bubbleWindow; + } + } + + private void setBubbleWindow() { + AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.bubble_dialog_style); + dialog = builder.create(); + View dialogView = View.inflate(context, R.layout.bubble_layout, null); + if (direction == Direction.BOTTOM) { + angleView = dialogView.findViewById(R.id.bubble_angle_top); + dialogView.findViewById(R.id.bottom_rl).setVisibility(View.GONE); + if (theme == Theme.DARK) { + angleView.setBackground(ContextCompat.getDrawable(context, R.drawable.bubblewindow_angle_top_dark)); + } + } else if (direction == Direction.TOP) { + angleView = dialogView.findViewById(R.id.bubble_angle_bottom); + dialogView.findViewById(R.id.top_rl).setVisibility(View.GONE); + if (theme == Theme.DARK) { + angleView.setBackground(ContextCompat.getDrawable(context, R.drawable.bubblewindow_angle_bottom_dark)); + } + } + + LinearLayout linearLayout = dialogView.findViewById(R.id.bubble_layout); + if (baseItemViewList.size() > 0) { + //设置item的selector + switch (baseItemViewList.size()) { + case 1: + if (theme == Theme.LIGHT) { + if (selector) { + baseItemViewList.get(0).view.setBackground(ContextCompat.getDrawable(context, R.drawable.bubblewindow_one_selector)); + } else { + baseItemViewList.get(0).view.setBackground(ContextCompat.getDrawable(context, R.drawable.bubblewindow_background)); + } + } else { + baseItemViewList.get(0).view.setBackground(ContextCompat.getDrawable(context, R.drawable.bubblewindow_background_dark)); + } + break; + default: + if (theme == Theme.LIGHT) { + if (selector) { + baseItemViewList.get(0).view.setBackground(ContextCompat.getDrawable(context, R.drawable.bubblewindow_top_selector)); + baseItemViewList.get(baseItemViewList.size() - 1).view.setBackground(ContextCompat.getDrawable(context, R.drawable.bubblewindow_bottom_selector)); + } else { + baseItemViewList.get(0).view.setBackground(ContextCompat.getDrawable(context, R.drawable.bubblewindow_item_top)); + baseItemViewList.get(baseItemViewList.size() - 1).view.setBackground(ContextCompat.getDrawable(context, R.drawable.bubblewindow_item_bottom)); + } + } else { + baseItemViewList.get(0).view.setBackground(ContextCompat.getDrawable(context, R.drawable.bubblewindow_item_top_dark)); + baseItemViewList.get(baseItemViewList.size() - 1).view.setBackground(ContextCompat.getDrawable(context, R.drawable.bubblewindow_item_bottom_dark)); + } + + + if (baseItemViewList.size() > 2) { + for (int i = 1; i < baseItemViewList.size() - 1; i++) { + if (theme == Theme.LIGHT) { + if (selector) { + baseItemViewList.get(i).view.setBackground(ContextCompat.getDrawable(context, R.drawable.bubblewindow_center_selector)); + } else { + baseItemViewList.get(i).view.setBackground(ContextCompat.getDrawable(context, R.drawable.bubblewindow_item_center)); + } + } else { + baseItemViewList.get(i).view.setBackground(ContextCompat.getDrawable(context, R.drawable.bubblewindow_item_center_dark)); + } + } + } + break; + } + //设置角的selector + if (direction == Direction.BOTTOM && selector && theme == Theme.LIGHT) { + baseItemViewList.get(0).view.setOnTouchListener((v, event) -> { + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + angleView.setPressed(true); + baseItemViewList.get(0).view.setPressed(true); + break; + case MotionEvent.ACTION_MOVE: + if (!isTouchPointInView(baseItemViewList.get(0).view, event.getRawX(), event.getRawY())) { + angleView.setPressed(false); + baseItemViewList.get(0).view.setPressed(false); + } + break; + case MotionEvent.ACTION_UP: + if (baseItemViewList.get(0).view.isPressed()) { + angleView.setPressed(false); + baseItemViewList.get(0).view.setPressed(false); + if (onItemClick != null) { + onItemClick.onClick(baseItemViewList.get(0).tag, 0, BubbleWindow.this); + } + } + break; + } + return true; + }); + } + if (direction == Direction.TOP && selector && theme == Theme.LIGHT) { + baseItemViewList.get(baseItemViewList.size() - 1).view.setOnTouchListener((v, event) -> { + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + angleView.setPressed(true); + baseItemViewList.get(baseItemViewList.size() - 1).view.setPressed(true); + break; + case MotionEvent.ACTION_MOVE: + if (!isTouchPointInView(baseItemViewList.get(baseItemViewList.size() - 1).view, event.getRawX(), event.getRawY())) { + angleView.setPressed(false); + baseItemViewList.get(baseItemViewList.size() - 1).view.setPressed(false); + } + break; + case MotionEvent.ACTION_UP: + if (baseItemViewList.get(baseItemViewList.size() - 1).view.isPressed()) { + angleView.setPressed(false); + baseItemViewList.get(baseItemViewList.size() - 1).view.setPressed(false); + if (onItemClick != null) { + onItemClick.onClick(baseItemViewList.get(baseItemViewList.size() - 1).tag, baseItemViewList.size() - 1, BubbleWindow.this); + } + } + break; + } + return true; + }); + } + + + //设置点击事件以及item + for (int i = 0; i < baseItemViewList.size(); i++) { + //设置点击事件 + if (onItemClick != null) { + int finalI = i; + baseItemViewList.get(i).view.setOnClickListener(v -> { + if (AntiShakeUtil.getAntiShakeStateByView(v)) { + onItemClick.onClick(baseItemViewList.get(finalI).tag, finalI, BubbleWindow.this); + } + }); + } + //添加view + linearLayout.addView(baseItemViewList.get(i).view, LinearLayout.LayoutParams.MATCH_PARENT, ScreenUtil.dp2px(context, 50)); + if (i != baseItemViewList.size() - 1) { + linearLayout.addView(lineView(), LinearLayout.LayoutParams.MATCH_PARENT, ScreenUtil.dp2px(context, 0.5f)); + } + + } + } + dialog.setView(dialogView); + } + + private View lineView() { + View view = new View(context); + view.setBackgroundColor(ContextCompat.getColor(context, R.color.color_DDDDDD)); + return view; + } + + //设置dialog位置 + private void setPosition(View view) { + Window window = dialog.getWindow(); + window.setGravity(Gravity.TOP | Gravity.LEFT); + WindowManager.LayoutParams lp = window.getAttributes(); + int[] windowLocation = new int[2]; + view.getLocationOnScreen(windowLocation); + if (direction == Direction.TOP) { + int commonX = (int) (windowLocation[0] + view.getWidth() / 2 - ScreenUtil.dp2px(context, dialogWidth / 2)); + int commonY = 0; + if (context instanceof AppCompatActivity && ((AppCompatActivity) context).getSupportActionBar() != null) { + if (((AppCompatActivity) context).getSupportActionBar().isShowing()) { + commonY = (int) windowLocation[1] - ScreenUtil.getStatusBarHeight(context) + ScreenUtil.getActionBarHeight(context) - getDialogHeight() - ScreenUtil.dp2px(context, marging); + } + } else { + commonY = (int) windowLocation[1] - ScreenUtil.getStatusBarHeight(context) - getDialogHeight() - ScreenUtil.dp2px(context, marging); + } + //X方向限制 + if (commonX < ScreenUtil.dp2px(context, padding)) { + lp.x = ScreenUtil.dp2px(context, padding); + } else if ((int) (windowLocation[0] + ScreenUtil.dp2px(context, dialogWidth)) > ScreenUtil.getScreenWidth(context)) { + lp.x = ScreenUtil.getScreenWidth(context) - ScreenUtil.dp2px(context, padding) - ScreenUtil.dp2px(context, dialogWidth); + } else { + lp.x = commonX; + } + //Y方向限制 + if (commonY < ScreenUtil.dp2px(context, padding)) { + lp.y = ScreenUtil.dp2px(context, padding); + } else { + lp.y = commonY; + } + //移动角的位置 + float commonMove = windowLocation[0] + view.getWidth() / 2 - (lp.x + ScreenUtil.dp2px(context, dialogWidth / 2)); + if (commonMove > ScreenUtil.dp2px(context, dialogWidth / 2) - ScreenUtil.dp2px(context, 20)) { + angleView.setTranslationX(ScreenUtil.dp2px(context, dialogWidth / 2) - ScreenUtil.dp2px(context, 20)); + } else if (commonMove < -(ScreenUtil.dp2px(context, dialogWidth / 2) - ScreenUtil.dp2px(context, 10))) { + angleView.setTranslationX(-(ScreenUtil.dp2px(context, dialogWidth / 2) - ScreenUtil.dp2px(context, 20))); + } else { + angleView.setTranslationX(commonMove); + } + } else if (direction == Direction.BOTTOM) { + int commonX = (int) (windowLocation[0] + view.getWidth() / 2 - ScreenUtil.dp2px(context, dialogWidth / 2)); + int commonY = 0; + if (context instanceof AppCompatActivity && ((AppCompatActivity) context).getSupportActionBar() != null) { + if (((AppCompatActivity) context).getSupportActionBar().isShowing()) { + commonY = (int) windowLocation[1] - ScreenUtil.getStatusBarHeight(context) + ScreenUtil.getActionBarHeight(context) + view.getHeight() - ScreenUtil.dp2px(context, marging); + } + } else { + commonY = (int) windowLocation[1] - ScreenUtil.getStatusBarHeight(context) + view.getHeight() - ScreenUtil.dp2px(context, marging); + } + //X方向限制 + if (commonX < ScreenUtil.dp2px(context, padding)) { + lp.x = ScreenUtil.dp2px(context, padding); + } else if ((int) (windowLocation[0] + ScreenUtil.dp2px(context, dialogWidth)) > ScreenUtil.getScreenWidth(context)) { + lp.x = ScreenUtil.getScreenWidth(context) - ScreenUtil.dp2px(context, padding) - ScreenUtil.dp2px(context, dialogWidth); + } else { + lp.x = commonX; + } + //Y方向限制 + if (commonY > ScreenUtil.getScreenHeight(context) - getDialogHeight()) { + lp.y = ScreenUtil.getScreenHeight(context) - ScreenUtil.dp2px(context, padding) - getDialogHeight(); + } else { + lp.y = commonY; + } + //移动角的位置 + float commonMove = windowLocation[0] + view.getWidth() / 2 - (lp.x + ScreenUtil.dp2px(context, dialogWidth / 2)); + if (commonMove > ScreenUtil.dp2px(context, dialogWidth / 2) - ScreenUtil.dp2px(context, 20)) { + angleView.setTranslationX(ScreenUtil.dp2px(context, dialogWidth / 2) - ScreenUtil.dp2px(context, 20)); + } else if (commonMove < -(ScreenUtil.dp2px(context, dialogWidth / 2) - ScreenUtil.dp2px(context, 10))) { + angleView.setTranslationX(-(ScreenUtil.dp2px(context, dialogWidth / 2) - ScreenUtil.dp2px(context, 20))); + } else { + angleView.setTranslationX(commonMove); + } + } + + window.setAttributes(lp); + dialog.show(); + } + + /** + * 弹窗的高度 + * + * @return + */ + private int getDialogHeight() { + return ScreenUtil.dp2px(context, (float) (50 * baseItemViewList.size() + 0.5 * (baseItemViewList.size() - 1) + 16 + marging)); + } + + /** + * 判断是否点击到view内 + * + * @param view 需要判断的view + * @param x 点击的x坐标 event.getRawX() + * @param y 点击的y坐标 event.getRawY() + * @return true在view内 + */ + + private boolean isTouchPointInView(View view, float x, float y) { + int location[] = new int[2]; + view.getLocationOnScreen(location); + int left = location[0]; + int top = location[1]; + int right = left + view.getMeasuredWidth(); + int bottom = top + view.getMeasuredHeight(); + return y >= top && y <= bottom && x >= left && x <= right; + } + + /** + * 弹窗实现类 + */ + private void setWindowInternal() { + + } + + /** + * 显示弹窗 + */ + public void show(View view) { + if (baseItemViewList.size() > 0) { + clickView = view; + setPosition(view); + } + } + + /** + * 返回点击的View + * + * @return view + */ + @Nullable + public View getView() { + return clickView; + } + + public void show() { + + } + + /** + * 隐藏弹窗 + */ + public void dismiss() { + dialog.cancel(); + } +} diff --git a/app/src/main/java/com/skipping/view/bubblewindow/Direction.java b/app/src/main/java/com/skipping/view/bubblewindow/Direction.java new file mode 100644 index 0000000..ff8ab4b --- /dev/null +++ b/app/src/main/java/com/skipping/view/bubblewindow/Direction.java @@ -0,0 +1,18 @@ +package com.skipping.view.bubblewindow; + +import androidx.annotation.IntDef; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Created by Ming + * 2020-08-14 + */ + +@Retention(RetentionPolicy.SOURCE) +@IntDef({Direction.TOP, Direction.BOTTOM}) +public @interface Direction { + int TOP = 0; + int BOTTOM = 1; +} diff --git a/app/src/main/java/com/skipping/view/bubblewindow/OnItemClick.java b/app/src/main/java/com/skipping/view/bubblewindow/OnItemClick.java new file mode 100644 index 0000000..12bd0fd --- /dev/null +++ b/app/src/main/java/com/skipping/view/bubblewindow/OnItemClick.java @@ -0,0 +1,10 @@ +package com.skipping.view.bubblewindow; + + +/** + * Created by Ming + * 2020-08-11 + */ +public interface OnItemClick { + void onClick(String tag, int position, BubbleWindow bubbleWindow); +} diff --git a/app/src/main/java/com/skipping/view/bubblewindow/Theme.java b/app/src/main/java/com/skipping/view/bubblewindow/Theme.java new file mode 100644 index 0000000..1efa6cb --- /dev/null +++ b/app/src/main/java/com/skipping/view/bubblewindow/Theme.java @@ -0,0 +1,17 @@ +package com.skipping.view.bubblewindow; + +import androidx.annotation.IntDef; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Created by Ming + * 12/29/20 + */ +@Retention(RetentionPolicy.SOURCE) +@IntDef({Theme.LIGHT, Theme.DARK}) +public @interface Theme { + int LIGHT = 0; + int DARK = 1; +} \ No newline at end of file diff --git a/app/src/main/java/com/skipping/view/bubblewindow/itemview/BaseItemView.java b/app/src/main/java/com/skipping/view/bubblewindow/itemview/BaseItemView.java new file mode 100644 index 0000000..25204bb --- /dev/null +++ b/app/src/main/java/com/skipping/view/bubblewindow/itemview/BaseItemView.java @@ -0,0 +1,23 @@ +package com.skipping.view.bubblewindow.itemview; + +import android.content.Context; +import android.view.View; + + +/** + * Created by Ming + * 2020-08-11 + */ +public abstract class BaseItemView { + + public View view; + public String tag; + public Context context; + + public BaseItemView(Context context, String tag){ + this.tag = tag; + this.context = context; + } + + public abstract void setView(); +} diff --git a/app/src/main/java/com/skipping/view/bubblewindow/itemview/ImageTextItemView.java b/app/src/main/java/com/skipping/view/bubblewindow/itemview/ImageTextItemView.java new file mode 100644 index 0000000..0d3ef5d --- /dev/null +++ b/app/src/main/java/com/skipping/view/bubblewindow/itemview/ImageTextItemView.java @@ -0,0 +1,40 @@ +package com.skipping.view.bubblewindow.itemview; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.DrawableRes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; + +import com.skipping.R; + + +/** + * Created by Ming + * 2020-08-11 + */ +public class ImageTextItemView extends BaseItemView { + private String text; + private int img; + + public ImageTextItemView(@NonNull Context context, @Nullable String tag, @Nullable String text, @DrawableRes int img) { + super(context, tag); + this.text = text; + this.img = img; + } + + @Override + public void setView() { + View itemView = LayoutInflater.from(context).inflate(R.layout.bubble_item_layout_imgtext, null); + TextView textView = itemView.findViewById(R.id.list_item_tv); + ImageView imageView = itemView.findViewById(R.id.list_item_img); + textView.setText(text); + imageView.setImageDrawable(ContextCompat.getDrawable(context, img)); + view = itemView; + } +} diff --git a/app/src/main/java/com/skipping/view/bubblewindow/itemview/TextItemView.java b/app/src/main/java/com/skipping/view/bubblewindow/itemview/TextItemView.java new file mode 100644 index 0000000..87eb6ca --- /dev/null +++ b/app/src/main/java/com/skipping/view/bubblewindow/itemview/TextItemView.java @@ -0,0 +1,30 @@ +package com.skipping.view.bubblewindow.itemview; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.TextView; + +import com.skipping.R; + + +/** + * Created by Ming + * 2020-08-11 + */ +public class TextItemView extends BaseItemView { + private String text; + + public TextItemView(Context context, String tag, String text) { + super(context, tag); + this.text = text; + } + + @Override + public void setView() { + View itemView = LayoutInflater.from(context).inflate(R.layout.bubble_item_layout_text, null); + TextView textView = itemView.findViewById(R.id.list_item_tv); + textView.setText(text); + view = itemView; + } +} diff --git a/app/src/main/res/drawable/bubblewindow_angle_bottom.xml b/app/src/main/res/drawable/bubblewindow_angle_bottom.xml new file mode 100644 index 0000000..70f3260 --- /dev/null +++ b/app/src/main/res/drawable/bubblewindow_angle_bottom.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bubblewindow_angle_bottom_clicked.xml b/app/src/main/res/drawable/bubblewindow_angle_bottom_clicked.xml new file mode 100644 index 0000000..085718e --- /dev/null +++ b/app/src/main/res/drawable/bubblewindow_angle_bottom_clicked.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bubblewindow_angle_bottom_dark.xml b/app/src/main/res/drawable/bubblewindow_angle_bottom_dark.xml new file mode 100644 index 0000000..2eda75f --- /dev/null +++ b/app/src/main/res/drawable/bubblewindow_angle_bottom_dark.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bubblewindow_angle_bottom_selector.xml b/app/src/main/res/drawable/bubblewindow_angle_bottom_selector.xml new file mode 100644 index 0000000..95225e2 --- /dev/null +++ b/app/src/main/res/drawable/bubblewindow_angle_bottom_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bubblewindow_angle_top.xml b/app/src/main/res/drawable/bubblewindow_angle_top.xml new file mode 100644 index 0000000..7f552db --- /dev/null +++ b/app/src/main/res/drawable/bubblewindow_angle_top.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bubblewindow_angle_top_clicked.xml b/app/src/main/res/drawable/bubblewindow_angle_top_clicked.xml new file mode 100644 index 0000000..20adc72 --- /dev/null +++ b/app/src/main/res/drawable/bubblewindow_angle_top_clicked.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bubblewindow_angle_top_dark.xml b/app/src/main/res/drawable/bubblewindow_angle_top_dark.xml new file mode 100644 index 0000000..aa016eb --- /dev/null +++ b/app/src/main/res/drawable/bubblewindow_angle_top_dark.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bubblewindow_angle_top_selector.xml b/app/src/main/res/drawable/bubblewindow_angle_top_selector.xml new file mode 100644 index 0000000..af36a27 --- /dev/null +++ b/app/src/main/res/drawable/bubblewindow_angle_top_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bubblewindow_background.xml b/app/src/main/res/drawable/bubblewindow_background.xml new file mode 100644 index 0000000..61d658a --- /dev/null +++ b/app/src/main/res/drawable/bubblewindow_background.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bubblewindow_background_dark.xml b/app/src/main/res/drawable/bubblewindow_background_dark.xml new file mode 100644 index 0000000..ffdc596 --- /dev/null +++ b/app/src/main/res/drawable/bubblewindow_background_dark.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bubblewindow_bottom_selector.xml b/app/src/main/res/drawable/bubblewindow_bottom_selector.xml new file mode 100644 index 0000000..61eee97 --- /dev/null +++ b/app/src/main/res/drawable/bubblewindow_bottom_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bubblewindow_center_selector.xml b/app/src/main/res/drawable/bubblewindow_center_selector.xml new file mode 100644 index 0000000..d530ccf --- /dev/null +++ b/app/src/main/res/drawable/bubblewindow_center_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bubblewindow_item_bottom.xml b/app/src/main/res/drawable/bubblewindow_item_bottom.xml new file mode 100644 index 0000000..f2b43a4 --- /dev/null +++ b/app/src/main/res/drawable/bubblewindow_item_bottom.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bubblewindow_item_bottom_clicked.xml b/app/src/main/res/drawable/bubblewindow_item_bottom_clicked.xml new file mode 100644 index 0000000..de5fd88 --- /dev/null +++ b/app/src/main/res/drawable/bubblewindow_item_bottom_clicked.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bubblewindow_item_bottom_dark.xml b/app/src/main/res/drawable/bubblewindow_item_bottom_dark.xml new file mode 100644 index 0000000..53ea6fc --- /dev/null +++ b/app/src/main/res/drawable/bubblewindow_item_bottom_dark.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bubblewindow_item_center.xml b/app/src/main/res/drawable/bubblewindow_item_center.xml new file mode 100644 index 0000000..417ef1a --- /dev/null +++ b/app/src/main/res/drawable/bubblewindow_item_center.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bubblewindow_item_center_clicked.xml b/app/src/main/res/drawable/bubblewindow_item_center_clicked.xml new file mode 100644 index 0000000..a1b66f3 --- /dev/null +++ b/app/src/main/res/drawable/bubblewindow_item_center_clicked.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bubblewindow_item_center_dark.xml b/app/src/main/res/drawable/bubblewindow_item_center_dark.xml new file mode 100644 index 0000000..e84c4e1 --- /dev/null +++ b/app/src/main/res/drawable/bubblewindow_item_center_dark.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bubblewindow_item_clicked.xml b/app/src/main/res/drawable/bubblewindow_item_clicked.xml new file mode 100644 index 0000000..2d755be --- /dev/null +++ b/app/src/main/res/drawable/bubblewindow_item_clicked.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bubblewindow_item_top.xml b/app/src/main/res/drawable/bubblewindow_item_top.xml new file mode 100644 index 0000000..052ed43 --- /dev/null +++ b/app/src/main/res/drawable/bubblewindow_item_top.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bubblewindow_item_top_clicked.xml b/app/src/main/res/drawable/bubblewindow_item_top_clicked.xml new file mode 100644 index 0000000..a17f95b --- /dev/null +++ b/app/src/main/res/drawable/bubblewindow_item_top_clicked.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bubblewindow_item_top_dark.xml b/app/src/main/res/drawable/bubblewindow_item_top_dark.xml new file mode 100644 index 0000000..778bb29 --- /dev/null +++ b/app/src/main/res/drawable/bubblewindow_item_top_dark.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bubblewindow_one_selector.xml b/app/src/main/res/drawable/bubblewindow_one_selector.xml new file mode 100644 index 0000000..2e03071 --- /dev/null +++ b/app/src/main/res/drawable/bubblewindow_one_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bubblewindow_top_selector.xml b/app/src/main/res/drawable/bubblewindow_top_selector.xml new file mode 100644 index 0000000..6827c7d --- /dev/null +++ b/app/src/main/res/drawable/bubblewindow_top_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/cancel.xml b/app/src/main/res/drawable/cancel.xml new file mode 100644 index 0000000..e491b64 --- /dev/null +++ b/app/src/main/res/drawable/cancel.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/grid_chengji.xml b/app/src/main/res/drawable/grid_chengji.xml new file mode 100644 index 0000000..9d3523f --- /dev/null +++ b/app/src/main/res/drawable/grid_chengji.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/grid_item_bg.xml b/app/src/main/res/drawable/grid_item_bg.xml new file mode 100644 index 0000000..d1a8df5 --- /dev/null +++ b/app/src/main/res/drawable/grid_item_bg.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/grid_left.xml b/app/src/main/res/drawable/grid_left.xml new file mode 100644 index 0000000..e81b8bc --- /dev/null +++ b/app/src/main/res/drawable/grid_left.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/grid_right.xml b/app/src/main/res/drawable/grid_right.xml new file mode 100644 index 0000000..dc7e8b8 --- /dev/null +++ b/app/src/main/res/drawable/grid_right.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_menu_camera.xml b/app/src/main/res/drawable/ic_menu_camera.xml new file mode 100644 index 0000000..634fe92 --- /dev/null +++ b/app/src/main/res/drawable/ic_menu_camera.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_menu_gallery.xml b/app/src/main/res/drawable/ic_menu_gallery.xml new file mode 100644 index 0000000..03c7709 --- /dev/null +++ b/app/src/main/res/drawable/ic_menu_gallery.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_menu_slideshow.xml b/app/src/main/res/drawable/ic_menu_slideshow.xml new file mode 100644 index 0000000..5e9e163 --- /dev/null +++ b/app/src/main/res/drawable/ic_menu_slideshow.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/left_clicked.xml b/app/src/main/res/drawable/left_clicked.xml new file mode 100644 index 0000000..06bf55d --- /dev/null +++ b/app/src/main/res/drawable/left_clicked.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/left_unclicked.xml b/app/src/main/res/drawable/left_unclicked.xml new file mode 100644 index 0000000..81d7397 --- /dev/null +++ b/app/src/main/res/drawable/left_unclicked.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ok.xml b/app/src/main/res/drawable/ok.xml new file mode 100644 index 0000000..79000cc --- /dev/null +++ b/app/src/main/res/drawable/ok.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/right_clicked.xml b/app/src/main/res/drawable/right_clicked.xml new file mode 100644 index 0000000..99aad2d --- /dev/null +++ b/app/src/main/res/drawable/right_clicked.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/right_unclicked.xml b/app/src/main/res/drawable/right_unclicked.xml new file mode 100644 index 0000000..97b14cc --- /dev/null +++ b/app/src/main/res/drawable/right_unclicked.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/side_nav_bar.xml b/app/src/main/res/drawable/side_nav_bar.xml new file mode 100644 index 0000000..6d81870 --- /dev/null +++ b/app/src/main/res/drawable/side_nav_bar.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/splash_preview.xml b/app/src/main/res/drawable/splash_preview.xml index 94ff8a8..350e798 100644 --- a/app/src/main/res/drawable/splash_preview.xml +++ b/app/src/main/res/drawable/splash_preview.xml @@ -5,7 +5,7 @@ diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index 31b0956..8d1d137 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -1,52 +1,323 @@ - + android:orientation="vertical"> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + android:fitsSystemWindows="true" > - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + android:layout_marginLeft="60dp" + android:layout_marginTop="20dp" + android:text="每组学生数量" + android:textColor="@color/color_70_E6E6E6" + android:textSize="20dp" /> - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_perform.xml b/app/src/main/res/layout/activity_perform.xml new file mode 100644 index 0000000..3b8c8b6 --- /dev/null +++ b/app/src/main/res/layout/activity_perform.xml @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/bubble_item_layout_imgtext.xml b/app/src/main/res/layout/bubble_item_layout_imgtext.xml new file mode 100644 index 0000000..0c59a27 --- /dev/null +++ b/app/src/main/res/layout/bubble_item_layout_imgtext.xml @@ -0,0 +1,26 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/bubble_item_layout_text.xml b/app/src/main/res/layout/bubble_item_layout_text.xml new file mode 100644 index 0000000..c30e6f5 --- /dev/null +++ b/app/src/main/res/layout/bubble_item_layout_text.xml @@ -0,0 +1,19 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/bubble_layout.xml b/app/src/main/res/layout/bubble_layout.xml new file mode 100644 index 0000000..a524c2f --- /dev/null +++ b/app/src/main/res/layout/bubble_layout.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/grid_item.xml b/app/src/main/res/layout/grid_item.xml new file mode 100644 index 0000000..a52823c --- /dev/null +++ b/app/src/main/res/layout/grid_item.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/perform_item.xml b/app/src/main/res/layout/perform_item.xml new file mode 100644 index 0000000..190b06c --- /dev/null +++ b/app/src/main/res/layout/perform_item.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-mdpi/down.png b/app/src/main/res/mipmap-mdpi/down.png new file mode 100644 index 0000000000000000000000000000000000000000..25275c5da9c9bd4c2437bd2938a711ad35145ac3 GIT binary patch literal 375 zcmV--0f_#IP)a_ zG1=grhhN*?@7wM+uBw6nI-mzkRX70S*qtk$KpH;x@t`fvy5B zkwG7A0r6JhU;Obug$W}W_2AgC)5U3i($D~tFtN`t&a_ zG1=grhhN*?@7wM+uBw6nI-mzkRX70S*qtk$KpH;x@t`fvy5B zkwG7A0r6JhU;Obug$W}W_2AgC)5U3i($D~tFtN`t&6P)tq zO(@F}=FPqVlD)r8lam9?eQ%;@6rcdUfO!1d>H$)q!=wYUwVB=m)cnkO6E=a%1l%jn zRc!+K4BRlMHQ?gGd$%MtkcI@T9N@y+#C*A}5V8i65RftRAIV%g;Ghm^K{F4VRY;pR z51Y91A$K)+NROk6y;S9=I%O0g{NKl)QjCL{hFo@?VIFFa*gn>?5UdA| zDqt2a!&I5nTA~RjwT8B}l<6yzC27#CI^g7Ct<(hbvDRu^J0L$kE+`%!3G!=_7R`|# zvouMq-88Mmm>pM=9?i8AzpA=#*;=6jX5qG3RcyTAQx9v6nzaF-^g5$d1sedyxa|(Q z1^)|Vwh-_9|6^35Hy9P55yxzxt6V}GT3C7i}f4; O0000a_ zG1=grhhN*?@7wM+uBw6nI-mzkRX70S*qtk$KpH;x@t`fvy5B zkwG7A0r6JhU;Obug$W}W_2AgC)5U3i($D~tFtN`t&6P)tq zO(@F}=FPqVlD)r8lam9?eQ%;@6rcdUfO!1d>H$)q!=wYUwVB=m)cnkO6E=a%1l%jn zRc!+K4BRlMHQ?gGd$%MtkcI@T9N@y+#C*A}5V8i65RftRAIV%g;Ghm^K{F4VRY;pR z51Y91A$K)+NROk6y;S9=I%O0g{NKl)QjCL{hFo@?VIFFa*gn>?5UdA| zDqt2a!&I5nTA~RjwT8B}l<6yzC27#CI^g7Ct<(hbvDRu^J0L$kE+`%!3G!=_7R`|# zvouMq-88Mmm>pM=9?i8AzpA=#*;=6jX5qG3RcyTAQx9v6nzaF-^g5$d1sedyxa|(Q z1^)|Vwh-_9|6^35Hy9P55yxzxt6V}GT3C7i}f4; O0000a_ zG1=grhhN*?@7wM+uBw6nI-mzkRX70S*qtk$KpH;x@t`fvy5B zkwG7A0r6JhU;Obug$W}W_2AgC)5U3i($D~tFtN`t&6P)tq zO(@F}=FPqVlD)r8lam9?eQ%;@6rcdUfO!1d>H$)q!=wYUwVB=m)cnkO6E=a%1l%jn zRc!+K4BRlMHQ?gGd$%MtkcI@T9N@y+#C*A}5V8i65RftRAIV%g;Ghm^K{F4VRY;pR z51Y91A$K)+NROk6y;S9=I%O0g{NKl)QjCL{hFo@?VIFFa*gn>?5UdA| zDqt2a!&I5nTA~RjwT8B}l<6yzC27#CI^g7Ct<(hbvDRu^J0L$kE+`%!3G!=_7R`|# zvouMq-88Mmm>pM=9?i8AzpA=#*;=6jX5qG3RcyTAQx9v6nzaF-^g5$d1sedyxa|(Q z1^)|Vwh-_9|6^35Hy9P55yxzxt6V}GT3C7i}f4; O0000#FF018786 #FF000000 #FFFFFFFF - #ffc20e + #2C2C2C #ffc20e #2C2C2C #F7FFF300 @@ -24,4 +24,8 @@ #D9D9D9 #F4EA2A #00FF55 + #80D8D8D8 + #4DE6E6E6 + #8C2C2C2C + #1296DB \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml new file mode 100644 index 0000000..4ab4520 --- /dev/null +++ b/app/src/main/res/values/dimens.xml @@ -0,0 +1,8 @@ + + + 16dp + 16dp + 8dp + 176dp + 16dp + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 47ffdae..9497779 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,14 @@ Skipping + MainActivity + Open navigation drawer + Close navigation drawer + Android Studio + android.studio@android.com + Navigation header + Settings + + Home + Gallery + Slideshow \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 4c5ceed..b96698b 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -8,4 +8,12 @@ true @drawable/splash_preview + + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index d7ab5ca..ede9044 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -26,4 +26,13 @@ @drawable/splash_preview + + +