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>(){ HttpObserver<UserBean> logginObserver; @Override protected void onSuccess(Results.LoggedInUser data) { public void onCreate(BaseActivity activity) { super.onCreate(activity); logginObserver = new HttpObserver<UserBean>(mActivity){ @Override protected void onSuccess(UserBean data) { loginResult.setValue(data); } }; public MutableLiveData<Results.LoggedInUser> getLoginResult() { } 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()); UserBean user = new Gson().fromJson(new Gson().toJson(loggedInUser.data) ,UserBean.class); 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(); }else{ showToast(loggedInUser.msg); } }); } 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.webpBinary files differ
app/src/main/res/mipmap-hdpi/ic_launcher_round.webpBinary files differ
app/src/main/res/mipmap-mdpi/ic_launcher.webpBinary files differ
app/src/main/res/mipmap-mdpi/ic_launcher_round.webpBinary files differ
app/src/main/res/mipmap-xhdpi/ic_launcher.webpBinary files differ
app/src/main/res/mipmap-xhdpi/ic_launcher_round.webpBinary files differ
app/src/main/res/mipmap-xxhdpi/app_icon.pngBinary files differ
app/src/main/res/mipmap-xxhdpi/ic_launcher.webpBinary files differ
app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webpBinary files differ
app/src/main/res/mipmap-xxxhdpi/ic_launcher.webpBinary files differ
app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webpBinary files differ
app/src/main/res/mipmap-xxxhdpi/welcom.pngBinary files differ