diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 41afc96..50a5060 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -11,6 +11,12 @@ android:supportsRtl="true" android:theme="@style/Theme.AppCompat.NoActionBar" tools:targetApi="31"> + + diff --git a/app/src/main/java/com/youxuegu/MainActivity.java b/app/src/main/java/com/youxuegu/MainActivity.java index a104db7..20d8c85 100644 --- a/app/src/main/java/com/youxuegu/MainActivity.java +++ b/app/src/main/java/com/youxuegu/MainActivity.java @@ -3,21 +3,250 @@ package com.youxuegu; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; +import android.graphics.Color; import android.os.Bundle; +import android.view.KeyEvent; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; +import android.widget.Toast; import com.youxuegu.activity.LoginActivity; import com.youxuegu.activity.RegisterActivity; +import com.youxuegu.utils.UtilsHelper; +import com.youxuegu.view.MyInfoView; /** * @author YoVinchen */ -public class MainActivity extends AppCompatActivity { +public class MainActivity extends AppCompatActivity implements View.OnClickListener { + private FrameLayout mBodyLayout; //中间内容栏 + public LinearLayout mBottomLayout; //底部按钮栏 + private View mCourseBtn, mExercisesBtn, mMyInfoBtn; + private TextView tv_course, tv_exercises, tv_myInfo; + private ImageView iv_course, iv_exercises, iv_myInfo; + private TextView tv_back, tv_main_title; + private RelativeLayout rl_title_bar; + + private MyInfoView mMyInfoView; +// private ExercisesView mExercisesView; +// private CourseView mCourseView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - Intent intent = new Intent(MainActivity.this, LoginActivity.class); - startActivity(intent); + init(); + setListener(); + selectDisplayView(0); + } + + /** + * 获取界面上的控件 + */ + private void init() { + tv_back = findViewById(R.id.tv_back); + tv_main_title = findViewById(R.id.tv_main_title); + tv_main_title.setText("优学谷课程"); + rl_title_bar = findViewById(R.id.title_bar); + rl_title_bar.setBackgroundColor(Color.parseColor("#30B4FF")); + tv_back.setVisibility(View.GONE); + mBodyLayout = findViewById(R.id.main_body); + mBottomLayout = findViewById(R.id.main_bottom_bar); + mCourseBtn = findViewById(R.id.bottom_bar_course_btn); + mExercisesBtn = findViewById(R.id.bottom_bar_exercises_btn); + mMyInfoBtn = findViewById(R.id.bottom_bar_myinfo_btn); + tv_course = findViewById(R.id.bottom_bar_text_course); + tv_exercises = findViewById(R.id.bottom_bar_text_exercises); + tv_myInfo = findViewById(R.id.bottom_bar_text_myinfo); + iv_course = findViewById(R.id.bottom_bar_image_course); + iv_exercises = findViewById(R.id.bottom_bar_image_exercises); + iv_myInfo = findViewById(R.id.bottom_bar_image_myinfo); + } + + + /** + * 设置底部按钮未被选中时的状态 + */ + private void setNotSelectedStatus() { + tv_course.setTextColor(Color.parseColor("#666666")); + tv_exercises.setTextColor(Color.parseColor("#666666")); + tv_myInfo.setTextColor(Color.parseColor("#666666")); + iv_course.setImageResource(R.drawable.main_course_icon); + iv_exercises.setImageResource(R.drawable.main_exercises_icon); + iv_myInfo.setImageResource(R.drawable.main_my_icon); + for (int i = 0; i < mBottomLayout.getChildCount(); i++) { + mBottomLayout.getChildAt(i).setSelected(false); + } + } + + /** + * 设置底部按钮被选中时的状态 + */ + private void setSelectedStatus(int index) { + switch (index) { + case 0: + mCourseBtn.setSelected(true); + iv_course.setImageResource(R.drawable.main_course_icon_selected); + tv_course.setTextColor(Color.parseColor("#0097F7")); + rl_title_bar.setVisibility(View.VISIBLE); + tv_main_title.setText("优学谷课程"); + break; + case 1: + mExercisesBtn.setSelected(true); + iv_exercises.setImageResource(R.drawable.main_exercises_icon_selected); + tv_exercises.setTextColor(Color.parseColor("#0097F7")); + rl_title_bar.setVisibility(View.VISIBLE); + tv_main_title.setText("优学谷习题"); + break; + case 2: + mMyInfoBtn.setSelected(true); + iv_myInfo.setImageResource(R.drawable.main_my_icon_selected); + tv_myInfo.setTextColor(Color.parseColor("#0097F7")); + rl_title_bar.setVisibility(View.GONE); + break; + } + } + + + /** + * 隐藏底部导航栏界面的中间部分视图 + */ + private void hideAllView() { + for (int i = 0; i < mBodyLayout.getChildCount(); i++) { + mBodyLayout.getChildAt(i).setVisibility(View.GONE); + } + } + + /** + * 创建视图 + */ + private void createView(int viewIndex) { + switch (viewIndex) { + case 0: + //课程界面 +// if (mCourseView == null) { +// mCourseView = new CourseView(this); +// mBodyLayout.addView(mCourseView.getView()); +// } else { +// mCourseView.getView(); +// } +// mCourseView.showView(); + break; + case 1: + //习题界面 +// if (mExercisesView == null) { +// mExercisesView = new ExercisesView(this); //实例化ExercisesView类 +// mBodyLayout.addView(mExercisesView.getView()); //将习题界面添加到底部导航栏的布局中 +// } else { +// mExercisesView.getView(); //获取习题界面 +// } +// mExercisesView.showView(); //显示习题界面 + break; + case 2: + //"我"的界面 + if (mMyInfoView == null) { + mMyInfoView = new MyInfoView(this); + //加载“我”的界面 + mBodyLayout.addView(mMyInfoView.getView()); + } else { + //获取“我”的界面 + mMyInfoView.getView(); + } + //显示“我”的界面 + mMyInfoView.showView(); + break; + } + } + + /** + * 设置底部按钮被选中时对应的界面中间部分视图 + */ + private void selectDisplayView(int index) { + //隐藏所有视图 + hideAllView(); + //创建被选中按钮对应的视图 + createView(index); + //设置被选中按钮的选中状态 + setSelectedStatus(index); + } + + /** + * 设置底部3个按钮的点击事件的监听器 + */ + private void setListener() { + for (int i = 0; i < mBottomLayout.getChildCount(); i++) { + mBottomLayout.getChildAt(i).setOnClickListener(this); + } + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + //"课程"按钮的点击事件 + case R.id.bottom_bar_course_btn: + setNotSelectedStatus(); + selectDisplayView(0); + break; + //"习题"按钮的点击事件 + case R.id.bottom_bar_exercises_btn: + setNotSelectedStatus(); + selectDisplayView(1); + break; + //"我"的按钮的点击事件 + case R.id.bottom_bar_myinfo_btn: + setNotSelectedStatus(); + selectDisplayView(2); + break; + default: + break; + } + } + + + /** + * 记录第一次点击时的时间 + */ + protected long exitTime; + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) { + if ((System.currentTimeMillis() - exitTime) > 2000) { + Toast.makeText(MainActivity.this, "再按一次退出博学谷", Toast.LENGTH_SHORT).show(); + //记录当前点击返回键的时间 + exitTime = System.currentTimeMillis(); + } else { + MainActivity.this.finish(); + if (UtilsHelper.readLoginStatus(MainActivity.this)) { + //清除登录状态与用户名 + UtilsHelper.clearLoginStatus(MainActivity.this); + } + System.exit(0); + } + return true; + } + return super.onKeyDown(keyCode, event); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (data != null) { + //获取从设置界面或登录界面传递过来的登录状态 + boolean isLogin = data.getBooleanExtra("isLogin", false); + //登录成功时显示课程界面 + if (isLogin) { + setNotSelectedStatus(); + selectDisplayView(0); + } + if (mMyInfoView != null) { + //登录成功或退出登录时根据isLogin的值设置"我"的界面 + mMyInfoView.setLoginParams(isLogin); + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/youxuegu/activity/ModifyPswActivity.java b/app/src/main/java/com/youxuegu/activity/ModifyPswActivity.java new file mode 100644 index 0000000..be7160f --- /dev/null +++ b/app/src/main/java/com/youxuegu/activity/ModifyPswActivity.java @@ -0,0 +1,96 @@ +package com.youxuegu.activity; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; + +import com.youxuegu.R; +import com.youxuegu.utils.MD5Utils; +import com.youxuegu.utils.UtilsHelper; + +public class ModifyPswActivity extends AppCompatActivity implements View.OnClickListener { + private TextView tv_main_title; + private TextView tv_back; + private EditText et_original_psw, et_new_psw, et_new_psw_again; + private Button btn_save; + private String originalPsw, newPsw, newPswAgain; + private String spOriginalPsw, userName; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_modify_psw); + init(); + userName = UtilsHelper.readLoginUserName(this); + spOriginalPsw = UtilsHelper.readPsw(this, userName); + } + + private void init() { + tv_main_title = findViewById(R.id.tv_main_title); + tv_main_title.setText("修改密码"); + tv_back = findViewById(R.id.tv_back); + et_original_psw = findViewById(R.id.et_original_psw); + et_new_psw = findViewById(R.id.et_new_psw); + et_new_psw_again = findViewById(R.id.et_new_psw_again); + btn_save = findViewById(R.id.btn_save); + tv_back.setOnClickListener(this); + btn_save.setOnClickListener(this); + } + + @Override + public void onClick(View view) { + switch (view.getId()) { + case R.id.tv_back: + ModifyPswActivity.this.finish(); + break; + case R.id.btn_save: + getEditString(); + if (TextUtils.isEmpty(originalPsw)) { + Toast.makeText(ModifyPswActivity.this, "请输入原始密码", Toast.LENGTH_SHORT).show(); + return; + } else if (!MD5Utils.md5(originalPsw).equals(spOriginalPsw)) { + Toast.makeText(ModifyPswActivity.this, "输入的密码与原始密码不相同", Toast.LENGTH_SHORT).show(); + return; + } else if (MD5Utils.md5(newPsw).equals(spOriginalPsw)) { + Toast.makeText(ModifyPswActivity.this, "输入的新密码与原始密码不能相同", Toast.LENGTH_SHORT).show(); + return; + } else if (TextUtils.isEmpty(newPsw)) { + Toast.makeText(ModifyPswActivity.this, "请输入新密码", Toast.LENGTH_SHORT).show(); + return; + } else if (TextUtils.isEmpty(newPswAgain)) { + Toast.makeText(ModifyPswActivity.this, "请再次输入新密码", Toast.LENGTH_SHORT).show(); + return; + } else if (!newPsw.equals(newPswAgain)) { + Toast.makeText(ModifyPswActivity.this, "两次输入的新密码不一致", Toast.LENGTH_SHORT).show(); + return; + } else { + Toast.makeText(ModifyPswActivity.this, "新密码设置成功", Toast.LENGTH_SHORT).show(); + //保存新密码到SharedPreferences文件中 + UtilsHelper.saveUserInfo(ModifyPswActivity.this, userName, newPsw); + Intent intent = new Intent(ModifyPswActivity.this, LoginActivity.class); + startActivity(intent); + //关闭设置界面 + SettingActivity.instance.finish(); + //关闭修改密码界面 + ModifyPswActivity.this.finish(); + } + break; + } + } + + /** + * 获取界面输入框控件上的字符串 + */ + private void getEditString() { + originalPsw = et_original_psw.getText().toString().trim(); + newPsw = et_new_psw.getText().toString().trim(); + newPswAgain = et_new_psw_again.getText().toString().trim(); + } +} diff --git a/app/src/main/java/com/youxuegu/activity/SettingActivity.java b/app/src/main/java/com/youxuegu/activity/SettingActivity.java new file mode 100644 index 0000000..4a75858 --- /dev/null +++ b/app/src/main/java/com/youxuegu/activity/SettingActivity.java @@ -0,0 +1,75 @@ +package com.youxuegu.activity; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Intent; +import android.graphics.Color; +import android.os.Bundle; +import android.view.View; +import android.widget.RelativeLayout; +import android.widget.TextView; +import android.widget.Toast; + +import com.youxuegu.R; +import com.youxuegu.utils.UtilsHelper; + +public class SettingActivity extends AppCompatActivity implements View.OnClickListener { + private TextView tv_main_title; + private TextView tv_back; + private RelativeLayout rl_title_bar; + private RelativeLayout rl_modify_psw, rl_security_setting, rl_exit_login; + public static SettingActivity instance = null; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_setting); + instance = this; + init(); + } + + private void init() { + tv_main_title = findViewById(R.id.tv_main_title); + tv_main_title.setText("设置"); + tv_back = findViewById(R.id.tv_back); + rl_title_bar = findViewById(R.id.title_bar); + rl_title_bar.setBackgroundColor(Color.parseColor("#30B4FF")); + rl_modify_psw = findViewById(R.id.rl_modify_psw); + rl_security_setting = findViewById(R.id.rl_security_setting); + rl_exit_login = findViewById(R.id.rl_exit_login); + tv_back.setOnClickListener(this); + rl_modify_psw.setOnClickListener(this); + rl_security_setting.setOnClickListener(this); + rl_exit_login.setOnClickListener(this); + } + + @Override + public void onClick(View view) { + switch (view.getId()) { + case R.id.tv_back: + this.finish(); + break; + case R.id.rl_modify_psw: + //跳转到修改密码界面 + Intent intent = new Intent(SettingActivity.this, ModifyPswActivity.class); + startActivity(intent); + break; + case R.id.rl_security_setting: + //跳转到设置密保界面 +// Intent securityIntent = new Intent(SettingActivity.this, FindPswActivity.class); +// securityIntent.putExtra("from", "security"); +// startActivity(securityIntent); + break; + case R.id.rl_exit_login: + Toast.makeText(SettingActivity.this, "退出登录成功", Toast.LENGTH_SHORT).show(); + //清除登录状态和登录时的用户名 + UtilsHelper.clearLoginStatus(SettingActivity.this); + Intent data = new Intent(); + data.putExtra("isLogin", false); + setResult(RESULT_OK, data); + SettingActivity.this.finish(); + break; + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/youxuegu/utils/UtilsHelper.java b/app/src/main/java/com/youxuegu/utils/UtilsHelper.java index b19140f..d6fa5a4 100644 --- a/app/src/main/java/com/youxuegu/utils/UtilsHelper.java +++ b/app/src/main/java/com/youxuegu/utils/UtilsHelper.java @@ -59,4 +59,28 @@ public class UtilsHelper { //提交修改 editor.commit(); } + + public static boolean readLoginStatus(Context context) { + SharedPreferences sp = context.getSharedPreferences("loginInfo", Context.MODE_PRIVATE); + boolean isLogin = sp.getBoolean("isLogin", false); + return isLogin; + } + + public static void clearLoginStatus(Context context) { + SharedPreferences sp = context.getSharedPreferences("loginInfo", Context.MODE_PRIVATE); + //获取编辑器 + SharedPreferences.Editor editor = sp.edit(); + //清除登录状态 + editor.putBoolean("isLogin", false); + //清除登录时的用户名 + editor.putString("loginUserName", ""); + //提交修改 + editor.commit(); + } + public static String readLoginUserName(Context context) { + SharedPreferences sp = context.getSharedPreferences("loginInfo", Context.MODE_PRIVATE); + //获取登录时用户名 + String userName = sp.getString("loginUserName", ""); + return userName; + } } diff --git a/app/src/main/java/com/youxuegu/view/MyInfoView.java b/app/src/main/java/com/youxuegu/view/MyInfoView.java new file mode 100644 index 0000000..25d0c4f --- /dev/null +++ b/app/src/main/java/com/youxuegu/view/MyInfoView.java @@ -0,0 +1,118 @@ +package com.youxuegu.view; + +import android.app.Activity; +import android.content.Intent; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; +import android.widget.Toast; + +import com.youxuegu.R; +import com.youxuegu.activity.LoginActivity; +import com.youxuegu.activity.SettingActivity; +import com.youxuegu.utils.UtilsHelper; + +/** + * @author YoVinchen + */ +public class MyInfoView implements View.OnClickListener { + public ImageView iv_head_icon; + private LinearLayout ll_head; + private RelativeLayout rl_course_history, rl_setting; + private TextView tv_user_name; + private Activity mContext; + private LayoutInflater mInflater; + private View mCurrentView; + //记录登录状态 + private boolean isLogin = false; + + public MyInfoView(Activity context) { + mContext = context; + mInflater = LayoutInflater.from(mContext); + } + + private void initView() { + mCurrentView = mInflater.inflate(R.layout.main_view_myinfo, null); + ll_head = mCurrentView.findViewById(R.id.ll_head); + iv_head_icon = mCurrentView.findViewById(R.id.iv_head_icon); + rl_course_history = mCurrentView.findViewById(R.id.rl_course_history); + rl_setting = mCurrentView.findViewById(R.id.rl_setting); + tv_user_name = mCurrentView.findViewById(R.id.tv_user_name); + mCurrentView.setVisibility(View.VISIBLE); + //设置登录时界面控件的显示信息 + setLoginParams(isLogin); + ll_head.setOnClickListener(this); + rl_course_history.setOnClickListener(this); + rl_setting.setOnClickListener(this); + } + + @Override + public void onClick(View view) { + switch (view.getId()) { + case R.id.ll_head: + if (UtilsHelper.readLoginStatus(mContext)) { + //跳转到个人资料界面 +// Intent intent = new Intent(mContext, UserInfoActivity.class); +// mContext.startActivity(intent); + } else { + //跳转到登录界面 + Intent intent = new Intent(mContext, LoginActivity.class); + mContext.startActivityForResult(intent, 1); + } + break; + case R.id.rl_course_history: +// if (UtilsHelper.readLoginStatus(mContext)) { +// //跳转到播放记录界面 +// Intent intent = new Intent(mContext, PlayHistoryActivity.class); +// mContext.startActivity(intent); +// } else { +// Toast.makeText(mContext, "您还未登录,请先登录", +// Toast.LENGTH_SHORT).show(); +// } + break; + case R.id.rl_setting: + if (UtilsHelper.readLoginStatus(mContext)) { + //跳转到设置界面 + Intent intent = new Intent(mContext, SettingActivity.class); + mContext.startActivityForResult(intent, 1); + } else { + Toast.makeText(mContext, "您还未登录,请先登录", + Toast.LENGTH_SHORT).show(); + } + break; + } + } + + /** + * 设置"我"的界面中用户名控件的显示信息 + */ + public void setLoginParams(boolean isLogin) { + if (isLogin) { + tv_user_name.setText(UtilsHelper.readLoginUserName(mContext)); + } else { + tv_user_name.setText("点击登录"); + } + } + + public View getView() { + //获取用户登录状态 + isLogin = UtilsHelper.readLoginStatus(mContext); + if (mCurrentView == null) { + + initView(); + } + return mCurrentView; + } + + public void showView() { + if (mCurrentView == null) { + //初始化界面控件 + initView(); + } + //设置"我"的界面为显示状态 + mCurrentView.setVisibility(View.VISIBLE); + } +} diff --git a/app/src/main/res/drawable-hdpi/launch_bg.png b/app/src/main/res/drawable-hdpi/launch_bg.png index 5c31efd..627e2e5 100644 Binary files a/app/src/main/res/drawable-hdpi/launch_bg.png and b/app/src/main/res/drawable-hdpi/launch_bg.png differ diff --git a/app/src/main/res/layout/activity_modify_psw.xml b/app/src/main/res/layout/activity_modify_psw.xml new file mode 100644 index 0000000..3c9e9a2 --- /dev/null +++ b/app/src/main/res/layout/activity_modify_psw.xml @@ -0,0 +1,37 @@ + + + + + + +