nilupeng
2022-08-09 58a4a54c62c65cab92c85fd3edeff832e4572ead
gson 转换日期问题
接入登录接口
修改图标和启动页
17 files added
4 files deleted
13 files modified
584 ■■■■ changed files
app/build.gradle 12 ●●●● patch | view | raw | blame | history
app/src/main/AndroidManifest.xml 2 ●●● patch | view | raw | blame | history
app/src/main/java/com/runt/open/mvvm/base/activities/BaseActivity.java 13 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/runt/open/mvvm/data/Results.java 4 ●●●● patch | view | raw | blame | history
app/src/main/java/com/runt/open/mvvm/retrofit/api/LoginApiCenter.java 5 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/runt/open/mvvm/retrofit/converter/DecryptGsonResponseBodyConverter.java 71 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/runt/open/mvvm/retrofit/converter/GsonConverterFactory.java 19 ●●●● patch | view | raw | blame | history
app/src/main/java/com/runt/open/mvvm/retrofit/converter/GsonResponseBodyConverter.java 85 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/runt/open/mvvm/retrofit/observable/HttpObserver.java 26 ●●●● patch | view | raw | blame | history
app/src/main/java/com/runt/open/mvvm/ui/login/LoginViewModel.java 30 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/runt/open/mvvm/ui/login/RegisterLoginActivity.java 23 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/runt/open/mvvm/ui/login/UserBean.java 41 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/runt/open/mvvm/ui/splash/SplashViewModel.java 36 ●●●●● patch | view | raw | blame | history
app/src/main/res/drawable-v24/ic_launcher_foreground.xml 30 ●●●●● patch | view | raw | blame | history
app/src/main/res/drawable/ic_dashboard_black_24dp.xml 9 ●●●●● patch | view | raw | blame | history
app/src/main/res/drawable/ic_home_black_24dp.xml 9 ●●●●● patch | view | raw | blame | history
app/src/main/res/drawable/ic_launcher_background.xml 134 ●●●● patch | view | raw | blame | history
app/src/main/res/drawable/ic_notifications_black_24dp.xml 9 ●●●●● patch | view | raw | blame | history
app/src/main/res/layout/activity_login.xml 2 ●●● patch | view | raw | blame | history
app/src/main/res/layout/activity_splash.xml 14 ●●●●● patch | view | raw | blame | history
app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml 5 ●●●●● patch | view | raw | blame | history
app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml 5 ●●●●● patch | view | raw | blame | history
app/src/main/res/mipmap-hdpi/ic_launcher.webp patch | view | raw | blame | history
app/src/main/res/mipmap-hdpi/ic_launcher_round.webp patch | view | raw | blame | history
app/src/main/res/mipmap-mdpi/ic_launcher.webp patch | view | raw | blame | history
app/src/main/res/mipmap-mdpi/ic_launcher_round.webp patch | view | raw | blame | history
app/src/main/res/mipmap-xhdpi/ic_launcher.webp patch | view | raw | blame | history
app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp patch | view | raw | blame | history
app/src/main/res/mipmap-xxhdpi/app_icon.png patch | view | raw | blame | history
app/src/main/res/mipmap-xxhdpi/ic_launcher.webp patch | view | raw | blame | history
app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp patch | view | raw | blame | history
app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp patch | view | raw | blame | history
app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp patch | view | raw | blame | history
app/src/main/res/mipmap-xxxhdpi/welcom.png patch | view | raw | blame | history
app/build.gradle
@@ -18,7 +18,7 @@
    buildTypes {
        debug{
            minifyEnabled false
            buildConfigField 'String','HOST_IP_ADDR','"http://192.168.110.116:8080/"'
            buildConfigField 'String','HOST_IP_ADDR','"http://192.168.110.134:8080/"'
            resValue "string", "app_name", "MVVM OPEN TEST"
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
@@ -38,14 +38,8 @@
    }
    android.applicationVariants.all { variant ->
        variant.outputs.all {
            def viron
            if (buildType.name.equals('release')) {
                viron = "正式版";
            }else if (buildType.name.equals('debug')) {
                viron = "开发版";
            }
            outputFileName =  "MVVM开源项目-" + viron + "-v" +
            def viron = name
            outputFileName =   "MVVM-OPEN-" + viron + "-v" +
                    defaultConfig.versionName +"-" + defaultConfig.versionCode +"-" + new Date().format("MMddHHmm", TimeZone.getTimeZone("UTC"))+
                    ".apk"
        }
app/src/main/AndroidManifest.xml
@@ -25,7 +25,7 @@
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/app_icon"
        android:icon="@mipmap/ic_launcher"
        android:name=".MyApplication"
        android:label="@string/app_name"
        android:supportsRtl="true"
app/src/main/java/com/runt/open/mvvm/base/activities/BaseActivity.java
@@ -10,23 +10,18 @@
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.util.Log;
import android.view.*;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.ColorRes;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModelProvider;
import androidx.viewbinding.ViewBinding;
import com.permissionx.guolindev.PermissionX;
import com.runt.open.mvvm.MyApplication;
import com.runt.open.mvvm.R;
@@ -35,13 +30,12 @@
import com.runt.open.mvvm.listener.ResPonse;
import com.runt.open.mvvm.util.PreferencesUtils;
import com.runt.open.mvvm.widgets.TitleBarView;
import dmax.dialog.SpotsDialog;
import java.io.File;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.util.Set;
import dmax.dialog.SpotsDialog;
/**
 * activity 封装
@@ -393,6 +387,7 @@
        }
    }
    public void showToast(String message){
        Log.i(TAG,"showToast "+message);
        runOnUiThread(() -> Toast.makeText(mContext,message,Toast.LENGTH_SHORT).show());
    }
app/src/main/java/com/runt/open/mvvm/data/Results.java
@@ -1,15 +1,11 @@
package com.runt.open.mvvm.data;
import com.runt.open.mvvm.ui.login.UserBean;
/**
 * My father is Object, ites purpose of
 *
 * @purpose Created by Runt (qingingrunt2010@qq.com) on 2022/1/29.
 */
public class Results {
    public static class LoggedInUser extends HttpApiResult<UserBean> { }
    public static class StringApiResult extends HttpApiResult<String> { }
app/src/main/java/com/runt/open/mvvm/retrofit/api/LoginApiCenter.java
@@ -4,6 +4,7 @@
import com.runt.open.mvvm.data.HttpApiResult;
import com.runt.open.mvvm.data.Results;
import com.runt.open.mvvm.ui.login.UserBean;
import io.reactivex.Observable;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
@@ -22,7 +23,7 @@
     */
    @FormUrlEncoded
    @POST("login")
    Observable<Results.LoggedInUser> login(@Field(Configuration.KEY_PHONE) String phone, @Field("pass") String pass);
    Observable<HttpApiResult<UserBean>> login(@Field(Configuration.KEY_PHONE) String phone, @Field("pass") String pass);
    /**
     * 验证码登录
@@ -32,7 +33,7 @@
     */
    @FormUrlEncoded
    @POST("loginCode")
    Observable<Results.LoggedInUser> loginByCode(@Field(Configuration.KEY_PHONE) String phone, @Field(Configuration.KEY_CODE) String code);
    Observable<HttpApiResult<UserBean>> loginByCode(@Field(Configuration.KEY_PHONE) String phone, @Field(Configuration.KEY_CODE) String code);
    @FormUrlEncoded
app/src/main/java/com/runt/open/mvvm/retrofit/converter/DecryptGsonResponseBodyConverter.java
File was deleted
app/src/main/java/com/runt/open/mvvm/retrofit/converter/GsonConverterFactory.java
@@ -1,16 +1,17 @@
package com.runt.open.mvvm.retrofit.converter;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.TypeAdapter;
import com.google.gson.reflect.TypeToken;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import com.runt.open.mvvm.data.HttpApiResult;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Converter;
import retrofit2.Retrofit;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
/**
 * My father is Object, ites purpose of     解密gson转换
@@ -20,11 +21,11 @@
public class GsonConverterFactory extends Converter.Factory {
    public static GsonConverterFactory create() {
        return create(new Gson(),false);
        return create(false);
    }
    public static GsonConverterFactory create(boolean transHump) {
        return create(new Gson(),transHump);
        return create(new GsonBuilder().setDateFormat("MMMM dd, yyyy, HH:mm:ss").create(),transHump);
    }
@@ -43,10 +44,10 @@
    }
    @Override
    public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations,
    public Converter<ResponseBody, ? extends HttpApiResult> responseBodyConverter(Type type, Annotation[] annotations,
                                                            Retrofit retrofit) {
        TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
        return new DecryptGsonResponseBodyConverter<>(gson, adapter,transHump);
        TypeAdapter<? extends HttpApiResult> adapter = (TypeAdapter<? extends HttpApiResult>) gson.getAdapter(TypeToken.get(type));
        return new GsonResponseBodyConverter<>(gson, adapter,transHump);
    }
    @Override
app/src/main/java/com/runt/open/mvvm/retrofit/converter/GsonResponseBodyConverter.java
New file
@@ -0,0 +1,85 @@
package com.runt.open.mvvm.retrofit.converter;
import android.util.Log;
import com.google.gson.Gson;
import com.google.gson.JsonIOException;
import com.google.gson.JsonSyntaxException;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.runt.open.mvvm.data.HttpApiResult;
import com.runt.open.mvvm.util.GsonUtils;
import okhttp3.ResponseBody;
import org.json.JSONException;
import retrofit2.Converter;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
/**
 * My father is Object, ites purpose of     解密gson转换器
 *
 * @purpose Created by Runt (qingingrunt2010@qq.com) on 2021-7-22.
 */
public class GsonResponseBodyConverter<T extends HttpApiResult> implements Converter<ResponseBody, T> {
    private final Gson gson;
    private final TypeAdapter<T> adapter;
    private final Charset UTF_8 = Charset.forName("UTF-8");
    private final boolean transHump;//驼峰转换
    public GsonResponseBodyConverter(Gson gson, TypeAdapter<T> adapter, boolean transHump) {
        this.gson = gson;
        this.adapter = adapter;
        this.transHump = transHump;
    }
    @Override
    public T convert(ResponseBody value) throws IOException {
        T result = null;
        String response = null;
        try {
            String val = new String(value.bytes(),UTF_8);
            Log.e("Converter","val body:"+val);
            response = transHump? GsonUtils.toHumpJson(val):val;
            result = readString(response);
        } catch (Throwable e) {
            e.printStackTrace();
            Log.e("Converter","Throwable 数据类型转换错误 "+e);
            HttpApiResult apiResult = new HttpApiResult<>();
            apiResult.data = response;
            if(e instanceof JSONException){
                Log.e("Converter","Throwable 非标准json "+e);
                apiResult.code = 1014;
                apiResult.msg = "非标准json";
            }else if(e instanceof JsonSyntaxException){
                Log.e("Converter","Throwable 数据类型转换错误 "+e);
                apiResult.code = 1015;
                apiResult.msg = "数据类型转换错误";
            }else {
                apiResult.code = 1016;
                apiResult.msg = "类型转换错误"+e.getMessage();
                Log.e("Converter","Throwable "+e);
            }
            response = new Gson().toJson(apiResult);
            result = readString(response);
        } finally {
            value.close();
            return result;
        }
    }
    private T readString(String str) throws IOException {
        InputStream inputStream = new ByteArrayInputStream(str.getBytes());
        JsonReader jsonReader = gson.newJsonReader(new InputStreamReader(inputStream, UTF_8));
        T result = adapter.read(jsonReader);
        if (jsonReader.peek() != JsonToken.END_DOCUMENT) {
            throw new JsonIOException("JSON document was not fully consumed.");
        }
        return result;
    }
}
app/src/main/java/com/runt/open/mvvm/retrofit/observable/HttpObserver.java
@@ -1,9 +1,12 @@
package com.runt.open.mvvm.retrofit.observable;
import android.util.Log;
import com.google.gson.Gson;
import com.runt.open.mvvm.base.activities.BaseActivity;
import com.runt.open.mvvm.data.HttpApiResult;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
import retrofit2.adapter.rxjava2.HttpException;
import java.net.ConnectException;
import java.net.SocketTimeoutException;
@@ -11,15 +14,20 @@
import java.util.concurrent.TimeoutException;
import java.util.regex.Pattern;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
import retrofit2.adapter.rxjava2.HttpException;
/**
 * 网络请求观察
 * Created by Administrator on 2021/11/11 0011.
 */
public abstract class HttpObserver<RESULT> implements Observer<HttpApiResult<RESULT>> {
    BaseActivity activity;
    public HttpObserver() {
    }
    public HttpObserver(BaseActivity activity) {
        this.activity = activity;
    }
    final String TAG = "HttpObserver";
@@ -40,7 +48,6 @@
    @Override
    public void onError(Throwable e) {
        e.printStackTrace();
        Log.e(TAG,"onError "+e.getMessage()+" "+hashCode());
        int code = 600;
        String msg = "网络请求失败,请检查网络或稍后重试";
@@ -66,6 +73,11 @@
    protected abstract void onSuccess(RESULT data);
    protected void onFailed(HttpApiResult httpResult){}
    protected void onFailed(HttpApiResult error){
        Log.i(TAG,"onFailed "+activity);
        if(activity != null){
            activity.showToast(error.msg);
        }
    }
}
app/src/main/java/com/runt/open/mvvm/ui/login/LoginViewModel.java
@@ -1,19 +1,18 @@
package com.runt.open.mvvm.ui.login;
import androidx.lifecycle.MutableLiveData;
import com.runt.open.mvvm.base.activities.BaseActivity;
import com.runt.open.mvvm.base.model.BaseViewModel;
import com.runt.open.mvvm.data.HttpApiResult;
import com.runt.open.mvvm.data.Results;
import com.runt.open.mvvm.retrofit.api.LoginApiCenter;
import com.runt.open.mvvm.retrofit.observable.HttpObserver;
import com.runt.open.mvvm.retrofit.utils.RetrofitUtils;
import io.reactivex.Observable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import io.reactivex.Observable;
/**
 * Created by Administrator on 2021/11/15 0015.
@@ -26,17 +25,24 @@
        loginApi = RetrofitUtils.getInstance().getRetrofit(LoginApiCenter.class);
    }
    MutableLiveData<Results.LoggedInUser> loginResult = new MutableLiveData<>();
    MutableLiveData<UserBean> loginResult = new MutableLiveData<>();
    MutableLiveData<Integer> verifyResult = new MutableLiveData<>();
    MutableLiveData<Results.StringApiResult> resetResult = new MutableLiveData<>();
    MutableLiveData<Results.StringApiResult> registerResult = new MutableLiveData<>();
    HttpObserver<Results.LoggedInUser> logginObserver = new HttpObserver<Results.LoggedInUser>(){
        @Override
        protected void onSuccess(Results.LoggedInUser data) {
            loginResult.setValue(data);
        }
    };
    public MutableLiveData<Results.LoggedInUser> getLoginResult() {
    HttpObserver<UserBean> logginObserver;
    @Override
    public void onCreate(BaseActivity activity) {
        super.onCreate(activity);
        logginObserver = new HttpObserver<UserBean>(mActivity){
            @Override
            protected void onSuccess(UserBean data) {
                loginResult.setValue(data);
            }
        };
    }
    public MutableLiveData<UserBean> getLoginResult() {
        return loginResult;
    }
@@ -51,7 +57,7 @@
     */
    public void login(String username, String password) {
        // can be launched in a separate asynchronous job
        final Observable<Results.LoggedInUser> userObservable = loginApi.login(username, password);
        final Observable<HttpApiResult<UserBean>> userObservable = loginApi.login(username, password);
        httpObserverOnLoading(userObservable,logginObserver);
    }
app/src/main/java/com/runt/open/mvvm/ui/login/RegisterLoginActivity.java
@@ -34,6 +34,7 @@
        mBinding.txtLogin.setOnClickListener(onclick);
        mBinding.txtRegister.setOnClickListener(onclick);
        mBinding.txtPrivacy.setOnClickListener(onclick);
        mBinding.button.setOnClickListener(onclick);
        mBinding.editPhone.setText(getStringProjectPrefrence(Configuration.KEY_USERNAME));
        mViewModel.getVerifyResult().observe(this, result -> {
           if(result == 0){
@@ -45,20 +46,16 @@
           }
        });
        mViewModel.getLoginResult().observe(this, loggedInUser -> {
            if(loggedInUser.code == 200){
                putBooleanProjectPrefrence(Configuration.IS_LOGIN,true);
                putStringProjectPrefrence(Configuration.KEY_USERNAME, mBinding.editPhone.getText().toString());
            putBooleanProjectPrefrence(Configuration.IS_LOGIN,true);
            putStringProjectPrefrence(Configuration.KEY_USERNAME, mBinding.editPhone.getText().toString());
                UserBean user = new Gson().fromJson(new Gson().toJson(loggedInUser.data) ,UserBean.class);
                UserBean.setUser(user);
                putStringProjectPrefrence(Configuration.KEY_TOKEN, user.getToken());
                MyLog.i("registerlogin",user.toString());
                showToast(R.string.login_success);
                setResult(RESULT_CODE_SUCESS);
                finish();
            }else{
                showToast(loggedInUser.msg);
            }
            UserBean user = new Gson().fromJson(new Gson().toJson(loggedInUser) ,UserBean.class);
            UserBean.setUser(user);
            putStringProjectPrefrence(Configuration.KEY_TOKEN, user.getToken());
            MyLog.i("registerlogin",user.toString());
            showToast(R.string.login_success);
            setResult(RESULT_CODE_SUCESS);
            finish();
        });
    }
app/src/main/java/com/runt/open/mvvm/ui/login/UserBean.java
@@ -50,20 +50,11 @@
    /* 连续签到天数 */
    private int sign;
    /** 用户类型(0推广,1店员,2商家,3广告商) **/
    private Integer type;
    /** 上级管理者 **/
    private String upuser;
    /** 余额 **/
    private BigDecimal balance;
    /** 会员等级(0普通用户,1会员) **/
    private Integer vlevel;
    /** 会员到期时间 **/
    private Date vtime;
    /** 状态0通过,1审核中,-1封收益 , -2 限制支付 , -3限制广告 ,-4限制发送短信,-5永久限制发送短信,-6 限制登录 **/
    private String status;
@@ -133,16 +124,6 @@
        this.head = head;
    }
    public Integer getType() {
        return type;
    }
    public void setType(Integer type) {
        this.type = type;
    }
    public String getUpuser() {
        return upuser;
    }
@@ -159,25 +140,6 @@
    public void setBalance(BigDecimal balance) {
        this.balance = balance;
    }
    public Integer getVlevel() {
        return vlevel;
    }
    public void setVlevel(Integer vlevel) {
        this.vlevel = vlevel;
    }
    public Date getVtime() {
        return vtime;
    }
    public void setVtime(Date vtime) {
        this.vtime = vtime;
    }
    public String getStatus() {
        return status;
@@ -264,11 +226,8 @@
                ", head='" + head + '\'' +
                ", coin=" + coin +
                ", sign=" + sign +
                ", type=" + type +
                ", upuser='" + upuser + '\'' +
                ", balance=" + balance +
                ", vlevel=" + vlevel +
                ", vtime=" + vtime +
                ", status=" + status +
                ", wechat='" + wechat + '\'' +
                ", qq='" + qq + '\'' +
app/src/main/java/com/runt/open/mvvm/ui/splash/SplashViewModel.java
File was deleted
app/src/main/res/drawable-v24/ic_launcher_foreground.xml
New file
@@ -0,0 +1,30 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:aapt="http://schemas.android.com/aapt"
    android:width="108dp"
    android:height="108dp"
    android:viewportWidth="108"
    android:viewportHeight="108">
    <path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
        <aapt:attr name="android:fillColor">
            <gradient
                android:endX="85.84757"
                android:endY="92.4963"
                android:startX="42.9492"
                android:startY="49.59793"
                android:type="linear">
                <item
                    android:color="#44000000"
                    android:offset="0.0" />
                <item
                    android:color="#00000000"
                    android:offset="1.0" />
            </gradient>
        </aapt:attr>
    </path>
    <path
        android:fillColor="#FFFFFF"
        android:fillType="nonZero"
        android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
        android:strokeWidth="1"
        android:strokeColor="#00000000" />
</vector>
app/src/main/res/drawable/ic_dashboard_black_24dp.xml
New file
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24.0"
    android:viewportHeight="24.0">
    <path
        android:fillColor="#FF000000"
        android:pathData="M3,13h8L11,3L3,3v10zM3,21h8v-6L3,15v6zM13,21h8L21,11h-8v10zM13,3v6h8L21,3h-8z" />
</vector>
app/src/main/res/drawable/ic_home_black_24dp.xml
New file
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24.0"
    android:viewportHeight="24.0">
    <path
        android:fillColor="#FF000000"
        android:pathData="M10,20v-6h4v6h5v-8h3L12,3 2,12h3v8z" />
</vector>
app/src/main/res/drawable/ic_launcher_background.xml
@@ -2,169 +2,169 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="108dp"
    android:height="108dp"
    android:viewportHeight="108"
    android:viewportWidth="108">
    android:viewportWidth="108"
    android:viewportHeight="108">
    <path
        android:fillColor="#008577"
        android:fillColor="#3DDC84"
        android:pathData="M0,0h108v108h-108z" />
    <path
        android:fillColor="#00000000"
        android:pathData="M9,0L9,108"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,0L19,108"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M29,0L29,108"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M39,0L39,108"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M49,0L49,108"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M59,0L59,108"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M69,0L69,108"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M79,0L79,108"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M89,0L89,108"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M99,0L99,108"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,9L108,9"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,19L108,19"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,29L108,29"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,39L108,39"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,49L108,49"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,59L108,59"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,69L108,69"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,79L108,79"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,89L108,89"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,99L108,99"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,29L89,29"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,39L89,39"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,49L89,49"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,59L89,59"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,69L89,69"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,79L89,79"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M29,19L29,89"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M39,19L39,89"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M49,19L49,89"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M59,19L59,89"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M69,19L69,89"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M79,19L79,89"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
</vector>
app/src/main/res/drawable/ic_notifications_black_24dp.xml
New file
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24.0"
    android:viewportHeight="24.0">
    <path
        android:fillColor="#FF000000"
        android:pathData="M12,22c1.1,0 2,-0.9 2,-2h-4c0,1.1 0.89,2 2,2zM18,16v-5c0,-3.07 -1.64,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68C7.63,5.36 6,7.92 6,11v5l-2,2v1h16v-1l-2,-2z" />
</vector>
app/src/main/res/layout/activity_login.xml
@@ -20,7 +20,7 @@
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="50dp"
        android:src="@mipmap/app_icon"
        android:src="@mipmap/ic_launcher"
        android:adjustViewBounds="true"
        app:layout_constraintTop_toBottomOf="@id/title_bar"
        app:layout_constraintLeft_toLeftOf="parent"
app/src/main/res/layout/activity_splash.xml
@@ -6,12 +6,16 @@
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <ImageView
    <TextView
        android:text="MVVM\nOPEN"
        android:textStyle="bold"
        android:textSize="80dp"
        android:letterSpacing="0.1"
        android:textColor="@color/white"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@mipmap/welcom"
        android:scaleType="centerCrop"
        />
        android:gravity="center"
        android:background="@drawable/ic_launcher_background" />
</RelativeLayout>
app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
New file
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
    <background android:drawable="@drawable/ic_launcher_background" />
    <foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
New file
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
    <background android:drawable="@drawable/ic_launcher_background" />
    <foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
app/src/main/res/mipmap-hdpi/ic_launcher.webp
Binary files differ
app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
Binary files differ
app/src/main/res/mipmap-mdpi/ic_launcher.webp
Binary files differ
app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
Binary files differ
app/src/main/res/mipmap-xhdpi/ic_launcher.webp
Binary files differ
app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
Binary files differ
app/src/main/res/mipmap-xxhdpi/app_icon.png
Binary files differ
app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
Binary files differ
app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
Binary files differ
app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
Binary files differ
app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
Binary files differ
app/src/main/res/mipmap-xxxhdpi/welcom.png
Binary files differ