From 8bf69e3fe8774b0228aa8667b03be0f7dabaa4f6 Mon Sep 17 00:00:00 2001
From: nilupeng <qingingrunt2010@qq.com>
Date: Sat, 29 Jan 2022 03:57:55 +0000
Subject: [PATCH] 弹框 部分框架代码优化

---
 app/src/main/java/com/runt/open/mvvm/base/activities/BaseActivity.java                |   64 +++++++
 app/src/main/java/com/runt/open/mvvm/ui/main/notifications/NotificationsFragment.java |   11 
 app/src/main/res/color/text_normal.xml                                                |   12 +
 app/src/main/java/com/runt/open/mvvm/ui/main/MainViewModel.java                       |   11 +
 app/src/main/java/com/runt/open/mvvm/MainActivity.java                                |   50 ++++-
 app/src/main/java/com/runt/open/mvvm/base/fragments/BaseLoadPageFragment.java         |    1 
 app/src/main/java/com/runt/open/mvvm/data/PhoneDevice.java                            |   98 ++++++++++
 app/src/main/java/com/runt/open/mvvm/base/model/BaseViewModel.java                    |   28 +++
 app/src/main/java/com/runt/open/mvvm/retrofit/observable/HttpObserver.java            |   42 +++-
 app/src/main/java/com/runt/open/mvvm/data/LoadingCmd.java                             |   21 ++
 app/src/main/res/layout/layout_dialog.xml                                             |   78 ++++++++
 app/src/main/res/drawable-v21/edit_dialog_bg_white_border.xml                         |   28 +++
 app/src/main/java/com/runt/open/mvvm/ui/main/home/HomeFragment.java                   |   23 -
 app/src/main/res/layout/activity_main.xml                                             |   12 +
 app/src/main/java/com/runt/open/mvvm/listener/ResPonse.java                           |   14 +
 app/build.gradle                                                                      |    2 
 app/src/main/java/com/runt/open/mvvm/ui/main/dashboard/DashboardFragment.java         |   11 
 17 files changed, 452 insertions(+), 54 deletions(-)

diff --git a/app/build.gradle b/app/build.gradle
index 3633f0b..f46abb5 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -74,7 +74,7 @@
     implementation 'com.squareup.okhttp3:okhttp:4.9.0'
     implementation 'com.squareup.retrofit2:retrofit:2.9.0'
     implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0'    //RXjava和retrofit结合
-    implementation 'com.permissionx.guolindev:permissionx:1.2.2'    //权限依赖让你推广你就发群里?没有别的群了?
+    implementation 'com.guolindev.permissionx:permissionx:1.6.0'    //权限依赖
     implementation 'com.github.bumptech.glide:glide:4.12.0'
     annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
     implementation 'com.pangle.cn:ads-sdk-pro:4.0.2.2'//字节跳动  穿山甲广告
diff --git a/app/src/main/java/com/runt/open/mvvm/MainActivity.java b/app/src/main/java/com/runt/open/mvvm/MainActivity.java
index b180224..6871cf3 100644
--- a/app/src/main/java/com/runt/open/mvvm/MainActivity.java
+++ b/app/src/main/java/com/runt/open/mvvm/MainActivity.java
@@ -1,30 +1,52 @@
 package com.runt.open.mvvm;
 
-import android.os.Bundle;
+import android.Manifest;
 
-import com.google.android.material.bottomnavigation.BottomNavigationView;
-
-import androidx.appcompat.app.AppCompatActivity;
 import androidx.navigation.NavController;
 import androidx.navigation.Navigation;
-import androidx.navigation.ui.AppBarConfiguration;
 import androidx.navigation.ui.NavigationUI;
 
+import com.permissionx.guolindev.PermissionX;
+import com.runt.open.mvvm.base.activities.BaseActivity;
+import com.runt.open.mvvm.data.PhoneDevice;
 import com.runt.open.mvvm.databinding.ActivityMainBinding;
+import com.runt.open.mvvm.listener.ResPonse;
+import com.runt.open.mvvm.ui.main.MainViewModel;
 
-public class MainActivity extends AppCompatActivity {
-
-    private ActivityMainBinding binding;
+public class MainActivity extends BaseActivity<ActivityMainBinding, MainViewModel> {
 
     @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        binding = ActivityMainBinding.inflate(getLayoutInflater());
-        setContentView(binding.getRoot());
-
+    public void initViews() {
         NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_activity_main);
         NavigationUI.setupWithNavController(binding.navView, navController);
+        checkPermission();
     }
 
+    private void showPermissionDialog(){
+
+        showDialog("警告", "软件需要权限才能运行", "申请权限", "退出", new ResPonse() {
+            @Override
+            public void doSuccess(Object obj) {
+                checkPermission();
+            }
+
+            @Override
+            public void doError(Object obj) {
+                finish();
+                System.exit(0);
+            }
+        });
+    }
+    private void checkPermission(){
+        PermissionX.init(MainActivity.this)
+                .permissions(Manifest.permission.READ_PHONE_STATE)
+                .request((allGranted, grantedList, deniedList) -> {
+                    if(allGranted){
+                        PhoneDevice.setDevice(mContext);
+                    }else{
+                        showPermissionDialog();
+                    }
+
+                });
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/runt/open/mvvm/base/activities/BaseActivity.java b/app/src/main/java/com/runt/open/mvvm/base/activities/BaseActivity.java
index ffe24f5..5d775df 100644
--- a/app/src/main/java/com/runt/open/mvvm/base/activities/BaseActivity.java
+++ b/app/src/main/java/com/runt/open/mvvm/base/activities/BaseActivity.java
@@ -13,6 +13,7 @@
 import android.view.WindowManager;
 import android.view.inputmethod.InputMethodManager;
 import android.widget.EditText;
+import android.widget.TextView;
 import android.widget.Toast;
 
 import androidx.annotation.ColorRes;
@@ -26,6 +27,7 @@
 import com.runt.open.mvvm.R;
 import com.runt.open.mvvm.base.model.BaseViewModel;
 import com.runt.open.mvvm.base.model.ViewModelFactory;
+import com.runt.open.mvvm.listener.ResPonse;
 
 import java.io.File;
 import java.lang.reflect.Method;
@@ -113,6 +115,66 @@
     }
 
 
+    AlertDialog dialog;
+    /**
+     * 显示弹框
+     * @param title
+     * @param msg
+     * @param btnOk
+     * @param btnCancel
+     * @param resPonse
+     */
+    public void showDialog(String title, String msg, String btnOk,String btnCancel,final ResPonse resPonse){
+        showDialog(title,msg,null,btnOk,btnCancel,resPonse,false);
+    }
+
+    private void showDialog(String title, String msg, String hint,String btnOk,String btnCancel,final  ResPonse resPonse,boolean isEdit){
+
+        AlertDialog.Builder builder = new AlertDialog.Builder(this,R.style.TransparentDialog);
+        builder.setCancelable(false);
+        final View view = LayoutInflater.from(this).inflate(R.layout.layout_dialog,null);
+        TextView titleView = view.findViewById(R.id.txt_title);
+        TextView cancelView = view.findViewById(R.id.txt_cancel);
+        final TextView textView = view.findViewById(R.id.msg);
+        if(isEdit){
+            textView.setEnabled(true);
+        }else{
+            textView.setBackground(null);
+        }
+        cancelView.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                dialog.dismiss();
+                if(resPonse !=null){
+                    resPonse.doError(null);
+                }
+            }
+        });
+        cancelView.setText(btnCancel);
+        TextView confirmView = view.findViewById(R.id.txt_confirm);
+        confirmView.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                dialog.dismiss();
+                if(resPonse !=null){
+                    resPonse.doSuccess(textView.getText().toString());
+                }
+            }
+        });
+        confirmView.setText(btnOk);
+        confirmView.requestFocus();
+        if(hint != null){
+            textView.setHint(hint);
+        }
+        if(msg != null){
+            textView.setText(msg);
+        }
+        titleView.setText(title);
+        builder.setView(view);
+        dialog = builder.create();
+        dialog.show();
+    }
+
     AlertDialog loadingDialog;
     /**
      * 显示加载弹框
@@ -146,6 +208,8 @@
         getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
         //透明导航栏
         getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
+
+        setStatusBarTextColor(isBlack);
     }
 
     /**
diff --git a/app/src/main/java/com/runt/open/mvvm/base/fragments/BaseLoadPageFragment.java b/app/src/main/java/com/runt/open/mvvm/base/fragments/BaseLoadPageFragment.java
index 4d691b0..71cb4f2 100644
--- a/app/src/main/java/com/runt/open/mvvm/base/fragments/BaseLoadPageFragment.java
+++ b/app/src/main/java/com/runt/open/mvvm/base/fragments/BaseLoadPageFragment.java
@@ -99,6 +99,7 @@
             smartRefresh.finishLoadMore();
         }
     }
+
     public A getAdapter() {
         return adapter;
     }
diff --git a/app/src/main/java/com/runt/open/mvvm/base/model/BaseViewModel.java b/app/src/main/java/com/runt/open/mvvm/base/model/BaseViewModel.java
index a50ff27..3c172a9 100644
--- a/app/src/main/java/com/runt/open/mvvm/base/model/BaseViewModel.java
+++ b/app/src/main/java/com/runt/open/mvvm/base/model/BaseViewModel.java
@@ -1,9 +1,11 @@
 package com.runt.open.mvvm.base.model;
 
+import androidx.lifecycle.MutableLiveData;
 import androidx.lifecycle.ViewModel;
 
-import com.runt.open.mvvm.retrofit.observable.HttpObserver;
+import com.runt.open.mvvm.data.LoadingCmd;
 import com.runt.open.mvvm.retrofit.AndroidScheduler;
+import com.runt.open.mvvm.retrofit.observable.HttpObserver;
 
 import io.reactivex.Observable;
 import io.reactivex.schedulers.Schedulers;
@@ -13,6 +15,11 @@
  */
 public class BaseViewModel extends ViewModel {
 
+    MutableLiveData<LoadingCmd> loadLive = new MutableLiveData<>();
+
+    public MutableLiveData<LoadingCmd> getLoadLive() {
+        return loadLive;
+    }
 
     /**
      * 网络请求观察
@@ -27,5 +34,24 @@
     }
 
 
+    /**
+     * 网络请求观察
+     * @param observable
+     * @param <T>
+     * @return
+     */
+    public <T> void httpObserverOnLoading(Observable<T> observable, HttpObserver observer){
+        observable.subscribeOn(Schedulers.io())//指定网络请求在io后台线程中进行
+                .doOnSubscribe(disposable -> {
+                             loadLive.setValue(new LoadingCmd(LoadingCmd.CMD.LOADING,"请求数据中..."));
+                })
+                .observeOn(AndroidScheduler.mainThread())
+                .doOnComplete(() -> {
+                    loadLive.postValue(new LoadingCmd(LoadingCmd.CMD.DISSMISS));
+                })
+                .subscribe(observer);
+    }
+
+
 
 }
diff --git a/app/src/main/java/com/runt/open/mvvm/data/LoadingCmd.java b/app/src/main/java/com/runt/open/mvvm/data/LoadingCmd.java
new file mode 100644
index 0000000..1752dea
--- /dev/null
+++ b/app/src/main/java/com/runt/open/mvvm/data/LoadingCmd.java
@@ -0,0 +1,21 @@
+package com.runt.open.mvvm.data;
+
+/**
+ * My father is Object, ites purpose of 
+ *
+ * @purpose Created by Runt (qingingrunt2010@qq.com) on 2022/1/28.
+ */
+public class LoadingCmd {
+    public CMD code;public String msg;
+
+    public LoadingCmd(CMD code) {
+        this(code,"");
+    }
+
+    public LoadingCmd(CMD code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public enum CMD{LOADING,DISSMISS}
+}
diff --git a/app/src/main/java/com/runt/open/mvvm/data/PhoneDevice.java b/app/src/main/java/com/runt/open/mvvm/data/PhoneDevice.java
new file mode 100644
index 0000000..73ca7bb
--- /dev/null
+++ b/app/src/main/java/com/runt/open/mvvm/data/PhoneDevice.java
@@ -0,0 +1,98 @@
+package com.runt.open.mvvm.data;
+
+import android.content.Context;
+import android.os.Build;
+
+import com.runt.open.mvvm.util.DeviceUtil;
+import com.runt.open.mvvm.util.NetWorkUtils;
+
+/**
+ * My father is Object, ites purpose of
+ *
+ * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-10-7.
+ */
+
+public class PhoneDevice {
+
+    private String brand,model,androidVersion,androidCode,seriaNo,netIp;
+
+    static PhoneDevice device;
+
+    public static void setDevice(Context context) {
+        device = new PhoneDevice(Build.BRAND,Build.MODEL,Build.VERSION.SDK_INT+"",Build.VERSION.RELEASE, DeviceUtil.getSerialNumber(context), NetWorkUtils.getNetIp());
+    }
+
+    public static PhoneDevice getDevice() {
+        return device;
+    }
+
+    public PhoneDevice(String brand, String model, String androidVersion, String androidCode, String seriaNo, String netIp) {
+        this.brand = brand;
+        this.model = model;
+        this.androidVersion = androidVersion;
+        this.androidCode = androidCode;
+        this.seriaNo = seriaNo;
+        this.netIp = netIp;
+    }
+
+    public String getBrand() {
+        return brand;
+    }
+
+    public void setBrand(String brand) {
+        this.brand = brand;
+    }
+
+    public String getModel() {
+        return model;
+    }
+
+    public void setModel(String model) {
+        this.model = model;
+    }
+
+    public String getAndroidVersion() {
+        return androidVersion;
+    }
+
+    public void setAndroidVersion(String androidVersion) {
+        this.androidVersion = androidVersion;
+    }
+
+    public String getAndroidCode() {
+        return androidCode;
+    }
+
+    public void setAndroidCode(String androidCode) {
+        this.androidCode = androidCode;
+    }
+
+    public String getSeriaNo() {
+        return seriaNo;
+    }
+
+    public void setSeriaNo(String seriaNo) {
+        this.seriaNo = seriaNo;
+    }
+
+    public String getNetIp() {
+        return netIp;
+    }
+
+    public void setNetIp(String netIp) {
+        this.netIp = netIp;
+    }
+
+
+    @Override
+    public String toString() {
+        return "PhoneDevice{" +
+                "brand='" + brand + '\'' +
+                ", model='" + model + '\'' +
+                ", androidVersion='" + androidVersion + '\'' +
+                ", androidCode='" + androidCode + '\'' +
+                ", seriaNo='" + seriaNo + '\'' +
+                ", netIp='" + netIp + '\'' +
+                '}';
+    }
+}
diff --git a/app/src/main/java/com/runt/open/mvvm/listener/ResPonse.java b/app/src/main/java/com/runt/open/mvvm/listener/ResPonse.java
new file mode 100644
index 0000000..8e94f93
--- /dev/null
+++ b/app/src/main/java/com/runt/open/mvvm/listener/ResPonse.java
@@ -0,0 +1,14 @@
+package com.runt.open.mvvm.listener;
+
+import java.io.Serializable;
+
+/**
+ * Created by Administrator on 2018/5/25.
+ */
+public abstract class ResPonse<T> implements Serializable {
+
+    public abstract void doSuccess(T obj);
+
+    public  void doError(T obj){};
+
+}
diff --git a/app/src/main/java/com/runt/open/mvvm/retrofit/observable/HttpObserver.java b/app/src/main/java/com/runt/open/mvvm/retrofit/observable/HttpObserver.java
index b02e526..7024299 100644
--- a/app/src/main/java/com/runt/open/mvvm/retrofit/observable/HttpObserver.java
+++ b/app/src/main/java/com/runt/open/mvvm/retrofit/observable/HttpObserver.java
@@ -2,34 +2,38 @@
 
 import android.util.Log;
 
+import androidx.annotation.NonNull;
 import androidx.lifecycle.MutableLiveData;
 
 
 import com.runt.open.mvvm.data.BaseApiResult;
 
+import java.io.IOException;
 import java.lang.reflect.ParameterizedType;
 import java.net.SocketTimeoutException;
 
+import io.reactivex.SingleObserver;
 import io.reactivex.observers.DisposableObserver;
+import retrofit2.Response;
 
 /**
  * 网络请求观察
  * Created by Administrator on 2021/11/11 0011.
  */
-public abstract class HttpObserver<T extends BaseApiResult> extends DisposableObserver<T>{
+public abstract class HttpObserver<M extends BaseApiResult> extends DisposableObserver<Response<M>> implements SingleObserver<Response<M>> {
 
     final String TAG = "HttpObserver";
 
-    MutableLiveData<T> resultLive;
+    MutableLiveData<M> resultLive;
 
-    public HttpObserver(MutableLiveData<T> resultLive) {
+    public HttpObserver(MutableLiveData<M> resultLive) {
         this.resultLive = resultLive;
     }
 
 
     @Override
-    public void onNext(T value) {
-        resultLive.setValue(value);
+    public void onNext(Response<M> response) {
+        onExcuted(response);
     }
 
     @Override
@@ -38,8 +42,8 @@
 
         try {
             Log.e(TAG,this.getClass().getSimpleName()+" "+throwable.getMessage());
-            Class<T> entityClass = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
-            T t = entityClass.newInstance();//实例化一个泛型
+            Class<M> entityClass = (Class<M>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
+            M t = entityClass.newInstance();//实例化一个泛型
             t.code = 410;
             if( throwable instanceof SocketTimeoutException){
                 t.msg = "服务请求超时,请稍候再试";//设置错误信息
@@ -49,13 +53,13 @@
             resultLive.setValue(t);
         } catch (ClassCastException e) {
             e.printStackTrace();
-            T t = (T) new BaseApiResult<String>();
+            M t = (M) new BaseApiResult<String>();
             t.code = 409;
             t.msg = "实例化对象未指定泛型实体类";
             resultLive.setValue(t);
         } catch (Exception e) {
             e.printStackTrace();
-            T t = (T) new BaseApiResult<String>();
+            M t = (M) new BaseApiResult<String>();
             t.code = 409;
             t.msg = e.getMessage();
             resultLive.setValue(t);
@@ -63,7 +67,27 @@
     }
 
     @Override
+    public void onSuccess(Response<M> response) {
+        onExcuted(response);
+    }
+
+    private void onExcuted(@NonNull Response<M> response){
+
+        if(response.body() != null){
+            resultLive.setValue(response.body());
+        }else{
+            try {
+                String error = response.errorBody().string();
+                Log.i("subscribe","onExcuted "+error);
+                onError(new Throwable(error));
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+    @Override
     public void onComplete() {
         Log.i("subscribe","onComplete");
     }
+
 }
diff --git a/app/src/main/java/com/runt/open/mvvm/ui/main/MainViewModel.java b/app/src/main/java/com/runt/open/mvvm/ui/main/MainViewModel.java
new file mode 100644
index 0000000..72f198b
--- /dev/null
+++ b/app/src/main/java/com/runt/open/mvvm/ui/main/MainViewModel.java
@@ -0,0 +1,11 @@
+package com.runt.open.mvvm.ui.main;
+
+import com.runt.open.mvvm.base.model.BaseViewModel;
+
+/**
+ * My father is Object, ites purpose of
+ *
+ * @purpose Created by Runt (qingingrunt2010@qq.com) on 2022/1/28.
+ */
+public class MainViewModel extends BaseViewModel {
+}
diff --git a/app/src/main/java/com/runt/open/mvvm/ui/main/dashboard/DashboardFragment.java b/app/src/main/java/com/runt/open/mvvm/ui/main/dashboard/DashboardFragment.java
index 75b9a1e..5f93e54 100644
--- a/app/src/main/java/com/runt/open/mvvm/ui/main/dashboard/DashboardFragment.java
+++ b/app/src/main/java/com/runt/open/mvvm/ui/main/dashboard/DashboardFragment.java
@@ -5,6 +5,7 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.TextView;
+
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.fragment.app.Fragment;
@@ -16,15 +17,15 @@
 public class DashboardFragment extends Fragment {
 
     private DashboardViewModel dashboardViewModel;
-private FragmentDashboardBinding binding;
+    private FragmentDashboardBinding binding;
 
     public View onCreateView(@NonNull LayoutInflater inflater,
-            ViewGroup container, Bundle savedInstanceState) {
+                             ViewGroup container, Bundle savedInstanceState) {
         dashboardViewModel =
                 new ViewModelProvider(this).get(DashboardViewModel.class);
 
-    binding = FragmentDashboardBinding.inflate(inflater, container, false);
-    View root = binding.getRoot();
+        binding = FragmentDashboardBinding.inflate(inflater, container, false);
+        View root = binding.getRoot();
 
         final TextView textView = binding.textDashboard;
         dashboardViewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() {
@@ -36,7 +37,7 @@
         return root;
     }
 
-@Override
+    @Override
     public void onDestroyView() {
         super.onDestroyView();
         binding = null;
diff --git a/app/src/main/java/com/runt/open/mvvm/ui/main/home/HomeFragment.java b/app/src/main/java/com/runt/open/mvvm/ui/main/home/HomeFragment.java
index 4e34a2b..2a93b5b 100644
--- a/app/src/main/java/com/runt/open/mvvm/ui/main/home/HomeFragment.java
+++ b/app/src/main/java/com/runt/open/mvvm/ui/main/home/HomeFragment.java
@@ -5,40 +5,29 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.TextView;
+
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.fragment.app.Fragment;
 import androidx.lifecycle.Observer;
 import androidx.lifecycle.ViewModelProvider;
 
+import com.runt.open.mvvm.base.fragments.BaseFragment;
 import com.runt.open.mvvm.databinding.FragmentHomeBinding;
 
-public class HomeFragment extends Fragment {
+public class HomeFragment extends BaseFragment<FragmentHomeBinding,HomeViewModel> {
 
-    private HomeViewModel homeViewModel;
-private FragmentHomeBinding binding;
 
-    public View onCreateView(@NonNull LayoutInflater inflater,
-            ViewGroup container, Bundle savedInstanceState) {
-        homeViewModel =
-                new ViewModelProvider(this).get(HomeViewModel.class);
 
-    binding = FragmentHomeBinding.inflate(inflater, container, false);
-    View root = binding.getRoot();
-
+    @Override
+    public void initViews() {
         final TextView textView = binding.textHome;
-        homeViewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() {
+        viewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() {
             @Override
             public void onChanged(@Nullable String s) {
                 textView.setText(s);
             }
         });
-        return root;
     }
 
-@Override
-    public void onDestroyView() {
-        super.onDestroyView();
-        binding = null;
-    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/runt/open/mvvm/ui/main/notifications/NotificationsFragment.java b/app/src/main/java/com/runt/open/mvvm/ui/main/notifications/NotificationsFragment.java
index 72d952c..29970e8 100644
--- a/app/src/main/java/com/runt/open/mvvm/ui/main/notifications/NotificationsFragment.java
+++ b/app/src/main/java/com/runt/open/mvvm/ui/main/notifications/NotificationsFragment.java
@@ -5,6 +5,7 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.TextView;
+
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.fragment.app.Fragment;
@@ -16,15 +17,15 @@
 public class NotificationsFragment extends Fragment {
 
     private NotificationsViewModel notificationsViewModel;
-private FragmentNotificationsBinding binding;
+    private FragmentNotificationsBinding binding;
 
     public View onCreateView(@NonNull LayoutInflater inflater,
-            ViewGroup container, Bundle savedInstanceState) {
+                             ViewGroup container, Bundle savedInstanceState) {
         notificationsViewModel =
                 new ViewModelProvider(this).get(NotificationsViewModel.class);
 
-    binding = FragmentNotificationsBinding.inflate(inflater, container, false);
-    View root = binding.getRoot();
+        binding = FragmentNotificationsBinding.inflate(inflater, container, false);
+        View root = binding.getRoot();
 
         final TextView textView = binding.textNotifications;
         notificationsViewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() {
@@ -36,7 +37,7 @@
         return root;
     }
 
-@Override
+    @Override
     public void onDestroyView() {
         super.onDestroyView();
         binding = null;
diff --git a/app/src/main/res/color/text_normal.xml b/app/src/main/res/color/text_normal.xml
new file mode 100644
index 0000000..71b5c1c
--- /dev/null
+++ b/app/src/main/res/color/text_normal.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android" >
+
+     <item android:state_enabled="false" android:color="@color/enable_txt_color"/> <!-- pressed -->
+
+     <item android:state_pressed="true" android:color="@color/white"/> <!-- pressed -->
+
+     <item android:state_focused="true" android:color="@color/white"/> <!-- focused -->
+
+     <item android:color="@color/txt_color"/> <!-- default -->
+
+</selector>
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v21/edit_dialog_bg_white_border.xml b/app/src/main/res/drawable-v21/edit_dialog_bg_white_border.xml
new file mode 100644
index 0000000..5a0a7d2
--- /dev/null
+++ b/app/src/main/res/drawable-v21/edit_dialog_bg_white_border.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+    android:color="@color/color_gray" >
+    <item>
+        <selector xmlns:android="http://schemas.android.com/apk/res/android">
+            <item android:state_enabled="false">
+                <shape>
+                    <solid android:color="@color/transparent" />
+                </shape>
+            </item>
+            <item android:state_focused="true">
+                <shape>
+                    <solid android:color="@color/white" />
+                    <stroke android:width="0.5dp" android:color="@color/txt_normal" />
+                    <corners android:radius="@dimen/edit_corner" />
+                </shape>
+            </item>
+            <item>
+                <shape>
+                    <solid android:color="@color/white" />
+                    <stroke android:width="0.5dp" android:color="@color/gray_normal" />
+                    <corners android:radius="@dimen/edit_corner" />
+                </shape>
+            </item>
+        </selector>
+    </item>
+
+</ripple>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index a57477b..964ea3f 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -4,8 +4,16 @@
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/container"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:paddingTop="?attr/actionBarSize" >
+    android:layout_height="match_parent" >
+
+    <com.runt.open.mvvm.widgets.TitleBarView
+        android:id="@+id/title_bar"
+        android:layout_width="match_parent"
+        android:layout_height="?attr/actionBarSize"
+        android:background="@color/white"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent" />
 
     <com.google.android.material.bottomnavigation.BottomNavigationView
         android:id="@+id/nav_view"
diff --git a/app/src/main/res/layout/layout_dialog.xml b/app/src/main/res/layout/layout_dialog.xml
new file mode 100644
index 0000000..ffa52df
--- /dev/null
+++ b/app/src/main/res/layout/layout_dialog.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@drawable/bg_white_corner_8"
+    android:orientation="vertical">
+
+    <TextView
+        android:id="@+id/txt_title"
+        android:gravity="center"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:padding="20dp"
+        android:text="标题"
+        android:textSize="18sp"
+        android:textColor="@color/black" />
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="0.5dp"
+        android:background="@color/black_20" />
+
+    <EditText
+        android:id="@+id/msg"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:padding="10dp"
+        android:layout_margin="30dp"
+        android:background="@drawable/edit_dialog_bg_white_border"
+        android:enabled="false"
+        android:textColor="@color/txt_normal"
+        android:text="" />
+
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="0.5dp"
+        android:background="@color/black_20" />
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal">
+
+        <TextView
+            android:id="@+id/txt_cancel"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:padding="20dp"
+            android:layout_weight="1"
+            android:gravity="center"
+            android:text="取消"
+            android:textSize="14sp"
+            android:focusable="true"
+            android:textColor="@color/text_normal"
+            android:background="@drawable/btn_white_lb_corner" />
+
+        <View
+            android:layout_width="0.5dp"
+            android:layout_height="match_parent"
+            android:background="@color/black_20" />
+        <TextView
+            android:id="@+id/txt_confirm"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:padding="20dp"
+            android:focusable="true"
+            android:layout_weight="1"
+            android:gravity="center"
+            android:textSize="14sp"
+            android:text="确认"
+            android:textColor="@color/text_normal"
+            android:background="@drawable/btn_white_rb_corner" />
+
+
+    </LinearLayout>
+
+
+</LinearLayout>
\ No newline at end of file

--
Gitblit v1.9.1