wjc
2025-01-21 f10cda784bede39a861566850898747c38e6c94f
2025年01月21日15:31:52

华为应用市场上架需要:
1,注销账号功能;
2,过滤掉台湾省,因为国旗不符合;
2个文件已添加
11个文件已修改
486 ■■■■ 已修改文件
app/src/main/AndroidManifest.xml 54 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/internet/api/HttpApi.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/other/HdlAccountLogic.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/me/AccountAndSecurityActivity.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/me/UnregisterActivity.java 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/newC/PowerStationsListEdit.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_account_and_security.xml 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_unregister.xml 159 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values-en/strings.xml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values-zh/strings.xml 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values/strings.xml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
countrypicker/src/main/java/com/sahooz/library/countrypicker/Adapter.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
countrypicker/src/main/java/com/sahooz/library/countrypicker/Country.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/AndroidManifest.xml
@@ -5,33 +5,32 @@
    <uses-permission
        android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
        tools:ignore="ProtectedPermissions" />
<!--    &lt;!&ndash;Android13 照片&ndash;&gt;-->
<!--    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />-->
<!--    &lt;!&ndash;Android13 视频&ndash;&gt;-->
<!--    <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />-->
    <!--Android13 音频-->
    <!--    <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />-->
        tools:ignore="ProtectedPermissions" /> <!-- &lt;!&ndash;Android13 照片&ndash;&gt; -->
    <!-- <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> -->
    <!-- &lt;!&ndash;Android13 视频&ndash;&gt; -->
    <!-- <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> -->
    <!-- Android13 音频 -->
    <!-- <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" /> -->
    <uses-permission android:name="android.permission.VIBRATE" /> <!-- honor 角标 -->
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <!--    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />&lt;!&ndash;外部存储目录访问权限 谷歌play上架不了&ndash;&gt;-->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />&lt;!&ndash;外部存储目录访问权限 谷歌play上架不了&ndash;&gt; -->
    <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> <!-- wifi状态权限 -->
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.INTERNET" /> <!-- 开启网络权限 -->
    <!-- 位置信息 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 如果是安卓10.0,需要后台获取连接的wifi名称则添加进程获取位置信息权限 -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- android 10.0使用wifi api新添加的权限 -->
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <!-- UNI相机和存储的权限 -->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <!-- UNI相机和存储的权限 -->
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- 访问闪光灯 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- Optional. Required for location feature -->
    <!-- 为了提高sdk识别唯一用户的能力,保证消息推送的精准送达,建议集成以下权限(可选) -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
    <uses-permission android:name="android.permission.GET_TASKS" />
@@ -40,18 +39,13 @@
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.BLUETOOTH" /> <!-- Optional. Required for location feature -->
    <!-- 为了提高sdk识别唯一用户的能力,保证消息推送的精准送达,建议集成以下权限(可选) -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 如您需要接入地理围栏业务,建议集成以下权限(可选) -->
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" /> <!-- 如您需要接入地理围栏业务,建议集成以下权限(可选) -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!--    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> &lt;!&ndash; 如您需要对应设备通知相关的能力,建议集成以下权限(可选) &ndash;&gt;-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> &lt;!&ndash; 如您需要对应设备通知相关的能力,建议集成以下权限(可选) &ndash;&gt; -->
    <uses-permission android:name="com.huawei.android.launcher.permission.CHANGE_BADGE" /> <!-- 华为角标 -->
    <uses-permission android:name="com.vivo.notification.permission.BADGE_ICON" /> <!-- VIVO角标权限 -->
    <uses-permission android:name="com.hihonor.android.launcher.permission.CHANGE_BADGE" /> <!-- honor 角标 -->
    <uses-permission android:name="android.permission.VIBRATE" /> <!-- 振动器权限,JPUSH支持通知开启振动功能,小米推送必须 -->
    <uses-permission android:name="com.hihonor.android.launcher.permission.CHANGE_BADGE" /> <!-- 振动器权限,JPUSH支持通知开启振动功能,小米推送必须 -->
    <!-- 扩展备用权限(可选) -->
    <permission
        android:name="${applicationId}.permission.JOPERATE_MESSAGE"
@@ -65,6 +59,10 @@
    <uses-permission android:name="com.hdl.photovoltaic.permission.JPUSH_MESSAGE" /> <!-- 适配Android13,弹出通知必须权限 -->
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
    <queries>
        <package android:name="com.hdl.photovoltaic.services" />
    </queries>
    <application
        android:name=".HDLApp"
        android:allowBackup="true"
@@ -74,6 +72,9 @@
        android:requestLegacyExternalStorage="true"
        android:supportsRtl="true"
        android:theme="@style/Theme.PhotovoltaicDebug">
        <activity
            android:name=".ui.me.UnregisterActivity"
            android:exported="false" />
        <activity
            android:name=".ui.newC.PowerStationsMoveActivity"
            android:exported="false" />
@@ -186,10 +187,8 @@
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"
                tools:replace="android:resource" />
        </provider>
        <!-- 注册服务 -->
        </provider> <!-- 注册服务 -->
        <service android:name=".internet.HttpServer.MyNanoHttpService" /> <!-- 加它uniapp才能唤起相机 -->
        <provider
            android:name="io.dcloud.common.util.DCloud_FileProvider"
            android:authorities="com.hdl.photovoltaic.dc.fileprovider"
@@ -226,7 +225,6 @@
        <service
            android:name="org.eclipse.paho.android.service.MqttService"
            android:exported="false" />
        <service
            android:name=".services.UniappService"
            android:enabled="true"
@@ -246,7 +244,5 @@
            android:name="ScopedStorage"
            android:value="true" />
    </application>
    <queries>
        <package android:name="com.hdl.photovoltaic.services" />
    </queries>
</manifest>
app/src/main/java/com/hdl/photovoltaic/internet/api/HttpApi.java
@@ -198,7 +198,8 @@
    public static final String C_POST_HOME_UPDATEDEBUGPERM = "/home-wisdom/app/home/updateDebugPerm";
    //下载子账号头像
    public static final String C_POST_HOME_GETHEADPÏORTRAIT = "/home-wisdom/app/child/account/getHeadPÏortrait";
    //注销账号
    public static final String C_POST_MEMBER_UNREGISTER = "/basis-footstone/member/unregister";
    //endregion
    //endregion
app/src/main/java/com/hdl/photovoltaic/other/HdlAccountLogic.java
@@ -687,6 +687,36 @@
    }
    /**
     * 注销账号(C端账号)
     *
     * @param pwd           账号密码
     * @param cloudCallBeak -
     */
    public void accountUnregisterC(String pwd, CloudCallBeak<Boolean> cloudCallBeak) {
        String requestUrl = HttpApi.C_POST_MEMBER_UNREGISTER;
        JsonObject json = new JsonObject();
        json.addProperty("userId", UserConfigManage.getInstance().getUserId());
        json.addProperty("pwd", pwd);
        HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak<String>() {
            @Override
            public void onSuccess(String jsonStr) {
                if (cloudCallBeak != null) {
                    cloudCallBeak.onSuccess(true);
                }
            }
            @Override
            public void onFailure(HDLException e) {
                if (cloudCallBeak != null) {
                    cloudCallBeak.onFailure(e);
                }
            }
        });
    }
    /**
     * 登录成功保存登录信息
     */
    private void saveUserData(HDLLoginBean obj) {
app/src/main/java/com/hdl/photovoltaic/ui/me/AccountAndSecurityActivity.java
@@ -28,7 +28,7 @@
    @Override
    public void onBindView(Bundle savedInstanceState) {
       setStatusBarTranslucent();
        setStatusBarTranslucent();
        getWindow().setNavigationBarColor(getColor(R.color.text_FF000000));
        //初始化
        initView();
@@ -70,10 +70,10 @@
            }
        });
        viewBinding.setAccountClose.setOnClickListener(new View.OnClickListener() {
        viewBinding.setAccountCloseIl.getRoot().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(UnregisterActivity.class);
            }
        });
@@ -88,6 +88,7 @@
            //云端接口不支持
            viewBinding.setAccountPhoneIl.parentCl.setVisibility(View.GONE);
            viewBinding.setAccountMailIl.parentCl.setVisibility(View.GONE);
            viewBinding.setAccountCloseIl.parentCl.setVisibility(View.GONE);
        } else {
            viewBinding.setAccountPhoneIl.parentCl.setVisibility(View.VISIBLE);
            viewBinding.setAccountMailIl.parentCl.setVisibility(View.VISIBLE);
@@ -98,6 +99,9 @@
            viewBinding.setAccountMailIl.sllLlRlNameTv.setText(R.string.set_email_address);
            viewBinding.setAccountMailIl.sllLlRlRightContentTv.setVisibility(View.VISIBLE);
            viewBinding.setAccountCloseIl.sllLlRlNameTv.setText(R.string.set_close_account);
            viewBinding.setAccountCloseIl.sllLlRlRightContentTv.setVisibility(View.VISIBLE);
        }
        viewBinding.setChangePswIl.sllLlRlNameTv.setText(R.string.home_login_change_password);
app/src/main/java/com/hdl/photovoltaic/ui/me/UnregisterActivity.java
New file
@@ -0,0 +1,125 @@
package com.hdl.photovoltaic.ui.me;
import android.os.Bundle;
import android.text.TextUtils;
import android.text.method.HideReturnsTransformationMethod;
import android.text.method.PasswordTransformationMethod;
import android.view.View;
import androidx.appcompat.content.res.AppCompatResources;
import com.hdl.linkpm.sdk.core.exception.HDLException;
import com.hdl.linkpm.sdk.user.HDLLinkPMUser;
import com.hdl.photovoltaic.R;
import com.hdl.photovoltaic.base.CustomBaseActivity;
import com.hdl.photovoltaic.config.UserConfigManage;
import com.hdl.photovoltaic.databinding.ActivityUnregisterBinding;
import com.hdl.photovoltaic.listener.CloudCallBeak;
import com.hdl.photovoltaic.other.HdlAccountLogic;
import com.hdl.photovoltaic.other.HdlThreadLogic;
import com.hdl.photovoltaic.widget.ConfirmationCancelDialog;
/**
 * 注销账号的界面
 */
public class UnregisterActivity extends CustomBaseActivity {
    private ActivityUnregisterBinding viewBinding;
    @Override
    public Object getContentView() {
        viewBinding = ActivityUnregisterBinding.inflate(getLayoutInflater());
        return viewBinding.getRoot();
    }
    @Override
    public void onBindView(Bundle savedInstanceState) {
        setStatusBarTranslucent();
        getWindow().setNavigationBarColor(getColor(R.color.text_FF000000));
        //初始化
        initView();
        //初始化界面监听器
        initEvent();
    }
    private void initEvent() {
        viewBinding.toolbarTopRl.topBackLl.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
        //密码隐藏按钮
        viewBinding.pswHideIv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (v.isSelected()) {
                    v.setSelected(false);
                    viewBinding.pswHideIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.hide));
                    viewBinding.pswEt.setTransformationMethod(PasswordTransformationMethod.getInstance());
                } else {
                    v.setSelected(true);
                    viewBinding.pswHideIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.show));
                    viewBinding.pswEt.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
                }
                if (!TextUtils.isEmpty(viewBinding.pswEt.getText())) {
                    viewBinding.pswEt.setSelection(viewBinding.pswEt.getText().length());
                }
            }
        });
        viewBinding.immediateCancellationTv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String pswStr = viewBinding.pswEt.getText().toString();
                if (TextUtils.isEmpty(pswStr)) {
                    HdlThreadLogic.tipFlashingBox(_mActivity, false, getString(R.string.home_login_error_password_null), -1);
                    return;
                }
                HdlAccountLogic.getInstance().accountUnregisterC(pswStr, new CloudCallBeak<Boolean>() {
                    @Override
                    public void onSuccess(Boolean obj) {
                        logoutRequest();
                    }
                    @Override
                    public void onFailure(HDLException e) {
                        HdlThreadLogic.tipFlashingBox(_mActivity, false, e.getMsg(), e.getCode());
                    }
                });
            }
        });
    }
    private void initView() {
        viewBinding.toolbarTopRl.topTitleTv.setText(R.string.immediate_cancellation);
        viewBinding.toolbarTopRl.topBackLl.setVisibility(View.VISIBLE);
        viewBinding.accEt.setText(UserConfigManage.getInstance().getAccount());
    }
    /**
     * 退出登录请求的方法
     */
    private void logoutRequest() {
        // 二次确认提示框
        ConfirmationCancelDialog dialog = new ConfirmationCancelDialog(this);
        dialog.show();
        dialog.setContent(getString(R.string.confirm_account));
        dialog.isHideTitle(true);
        dialog.setYesOnclickListener(new ConfirmationCancelDialog.onYesOnclickListener() {
            @Override
            public void Confirm() {
                dialog.dismiss();
                HDLLinkPMUser.getInstance().logout(0);
            }
        });
        dialog.setNoOnclickListener(new ConfirmationCancelDialog.onNoOnclickListener() {
            @Override
            public void Cancel() {
                dialog.dismiss();
            }
        });
    }
}
app/src/main/java/com/hdl/photovoltaic/ui/newC/PowerStationsListEdit.java
@@ -126,11 +126,11 @@
            public void onClick(View v) {
                // 未授权 如果应用程序没有所需的权限,则显示解释说明
//                PermissionExplanationDialog.getInstance().showPortConflictPdDialog(_mActivity, getString(R.string.camera_storage_instructions), getString(R.string.camera_storage_purpose));
                PermissionExplanationDialog.getInstance().showPortConflictPdDialog(_mActivity, getString(R.string.camera_storage_instructions), getString(R.string.camera_storage_purpose));
                PermissionUtils.requestPermissionsResultCallback(_mActivity, Manifest.permission.CAMERA, new PermissionUtils.PermissionState() {
                    @Override
                    public void Success(int value) {
//                        PermissionExplanationDialog.getInstance().dismiss();
                        PermissionExplanationDialog.getInstance().dismiss();
                        if (value == PermissionUtils.STATUS_REFUSE_PERMANENT | value == PermissionUtils.STATUS_REFUSE) {
//                            HdlThreadLogic.toast(_mActivity, R.string.permission_open);
                            return;
app/src/main/res/layout/activity_account_and_security.xml
@@ -47,25 +47,34 @@
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/set_account_mail_il" />
    <!--暂时隐藏注销账号组件-->
    <TextView
        android:id="@+id/set_account_close"
    <include
        android:id="@+id/set_account_close_il"
        layout="@layout/set_line"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_52"
        android:layout_marginStart="@dimen/dp_20"
        android:layout_marginEnd="@dimen/dp_20"
        android:layout_marginBottom="@dimen/dp_55"
        android:background="@drawable/backgruond_ff6b6b"
        android:gravity="center"
        android:text="@string/set_close_account"
        android:textColor="@color/text_FFFFFFFF"
        android:textSize="@dimen/text_18"
        android:visibility="gone"
        app:layout_constraintBottom_toBottomOf="parent"
        android:layout_height="@dimen/dp_57"
        android:layout_marginTop="@dimen/dp_10"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/set_change_psw_il" />
        />
<!--    &lt;!&ndash;暂时隐藏注销账号组件&ndash;&gt;-->
<!--    <TextView-->
<!--        android:id="@+id/set_account_close"-->
<!--        android:layout_width="match_parent"-->
<!--        android:layout_height="@dimen/dp_52"-->
<!--        android:layout_marginStart="@dimen/dp_20"-->
<!--        android:layout_marginEnd="@dimen/dp_20"-->
<!--        android:layout_marginBottom="@dimen/dp_55"-->
<!--        android:background="@drawable/backgruond_ff6b6b"-->
<!--        android:gravity="center"-->
<!--        android:text="@string/set_close_account"-->
<!--        android:textColor="@color/text_FFFFFFFF"-->
<!--        android:textSize="@dimen/text_18"-->
<!--        app:layout_constraintBottom_toBottomOf="parent"-->
<!--        app:layout_constraintEnd_toEndOf="parent"-->
<!--        app:layout_constraintStart_toStartOf="parent"-->
<!--        />-->
</androidx.constraintlayout.widget.ConstraintLayout>
app/src/main/res/layout/activity_unregister.xml
New file
@@ -0,0 +1,159 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/text_FF000000"
    tools:context=".ui.me.UnregisterActivity">
    <include
        android:id="@+id/toolbar_top_rl"
        layout="@layout/toolbar_top_view_44"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_44"
        android:layout_marginTop="@dimen/dp_38"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    <TextView
        android:id="@+id/title_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/dp_10"
        android:lineSpacingExtra="2dp"
        android:paddingStart="@dimen/dp_20"
        android:paddingEnd="@dimen/dp_20"
        android:text="@string/account_not_recoverable"
        android:textColor="@color/text_66FFFFFF"
        android:textSize="@dimen/text_14"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/toolbar_top_rl" />
    <RelativeLayout
        android:id="@+id/acc_parent_rl"
        android:layout_width="match_parent"
        android:layout_height="78dp"
        android:layout_marginTop="@dimen/dp_25"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/title_tv">
        <TextView
            android:id="@+id/acc_title_tv"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/dp_20"
            android:layout_marginStart="@dimen/dp_20"
            android:text="@string/account"
            android:textColor="@color/text_E6FFFFFF"
            android:textSize="@dimen/text_14" />
        <RelativeLayout
            android:id="@+id/bind_phone_rl"
            android:layout_width="match_parent"
            android:layout_height="@dimen/dp_50"
            android:layout_below="@+id/acc_title_tv"
            android:layout_marginStart="@dimen/dp_20"
            android:layout_marginTop="@dimen/dp_8"
            android:layout_marginEnd="@dimen/dp_20"
            android:background="@drawable/me_change_psw_bj">
            <EditText
                android:id="@+id/acc_et"
                android:layout_width="match_parent"
                android:layout_height="@dimen/dp_23"
                android:layout_centerVertical="true"
                android:layout_marginStart="@dimen/dp_16"
                android:layout_marginEnd="@dimen/dp_60"
                android:background="@null"
                android:enabled="false"
                android:inputType="phone"
                android:lines="1"
                android:maxLines="1"
                android:textColor="@color/text_66FFFFFF"
                android:textSize="@dimen/text_14" />
        </RelativeLayout>
    </RelativeLayout>
    <RelativeLayout
        android:id="@+id/psw_parent_rl"
        android:layout_width="match_parent"
        android:layout_height="78dp"
        android:layout_marginTop="@dimen/dp_25"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/acc_parent_rl">
        <TextView
            android:id="@+id/psw_title_tv"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/dp_20"
            android:layout_marginStart="@dimen/dp_20"
            android:text="@string/psw"
            android:textColor="@color/text_E6FFFFFF"
            android:textSize="@dimen/text_14" />
        <!--输入登录密码-->
        <RelativeLayout
            android:id="@+id/psw_rl"
            android:layout_width="match_parent"
            android:layout_height="@dimen/dp_50"
            android:layout_below="@+id/psw_title_tv"
            android:layout_marginStart="@dimen/dp_20"
            android:layout_marginTop="@dimen/dp_8"
            android:layout_marginEnd="@dimen/dp_20"
            android:background="@drawable/me_change_psw_bj">
            <EditText
                android:id="@+id/psw_et"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_alignParentStart="true"
                android:layout_marginStart="@dimen/dp_20"
                android:layout_marginEnd="72dp"
                android:background="@null"
                android:hint="@string/home_login_input_psw"
                android:inputType="textPassword"
                android:lines="1"
                android:maxLines="1"
                android:textColor="@color/text_E6FFFFFF"
                android:textColorHint="@color/text_66FFFFFF"
                android:textSize="@dimen/text_14" />
            <ImageView
                android:id="@+id/psw_hide_iv"
                android:layout_width="@dimen/dp_20"
                android:layout_height="@dimen/dp_20"
                android:layout_alignParentEnd="true"
                android:layout_centerVertical="true"
                android:layout_marginEnd="@dimen/dp_20"
                android:src="@drawable/hide" />
        </RelativeLayout>
    </RelativeLayout>
    <!--立即注销-->
    <TextView
        android:id="@+id/immediate_cancellation__tv"
        android:layout_width="match_parent"
        android:layout_height="52dp"
        android:layout_marginStart="@dimen/dp_20"
        android:layout_marginTop="50dp"
        android:layout_marginEnd="@dimen/dp_20"
        android:background="@drawable/bj_ff39383d"
        android:gravity="center"
        android:text="@string/immediate_cancellation"
        android:textColor="@color/text_E6FFFFFF"
        android:textSize="14sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/psw_parent_rl" />
</androidx.constraintlayout.widget.ConstraintLayout>
app/src/main/res/values-en/strings.xml
@@ -339,5 +339,9 @@
    <string name="agree">Agree</string>
    <string name="user_agreement_and_privacy_agreement">User Agreement and Privacy Agreement</string>
    <string name="thank_you_for_using">Thank you for using Xenterra Solar. During your use, we may collect and use some of your personal information. Please read carefully, and ensure that you fully understand our rules for handling your personal information. If you agree to the 《User Agreement》 and 《Privacy Agreement》, please click "Agree" to start using Xenterra Solar.</string>
    <string name="confirm_account">Are you sure to cancel this account?</string>
    <string name="immediate_cancellation">Cancel immediately</string>
    <string name="account_not_recoverable">Cancelling an account is an irreversible operation. After account cancellation, all account data (including nickname, avatar, QR code photo, etc.) on your app will be deleted and cannot be retrieved.</string>
    <string name="account">Account</string>
    <string name="psw">Password</string>
</resources>
app/src/main/res/values-zh/strings.xml
@@ -336,6 +336,9 @@
    <string name="agree">同意</string>
    <string name="user_agreement_and_privacy_agreement">用户协议和隐私协议</string>
    <string name="thank_you_for_using">感谢您使用新特锐能 App,在您使用过程中,我们可能会对您的部分个人信息进行收集、使用,请您仔细阅读《用户协议》和《隐私协议》,并确定完全了解我们对您个人信息的处理规则。如您同意用户协议和隐私协议,请点击“同意”,开始使用新特锐能 App。</string>
    <string name="confirm_account">确认注销改账号吗?</string>
    <string name="immediate_cancellation">立即注销</string>
    <string name="account_not_recoverable">注销账户是不可恢复的操作,注销账户之后,您APP所有账户数据(包括昵称、头像、二维码照片等)都会被删除,且无法再找回。</string>
    <string name="account">账号</string>
    <string name="psw">密码</string>
</resources>
app/src/main/res/values/strings.xml
@@ -336,6 +336,10 @@
    <string name="agree">同意</string>
    <string name="user_agreement_and_privacy_agreement">用户协议和隐私协议</string>
    <string name="thank_you_for_using">感谢您使用新特锐能 App,在您使用过程中,我们可能会对您的部分个人信息进行收集、使用,请您仔细阅读《用户协议》和《隐私协议》,并确定完全了解我们对您个人信息的处理规则。如您同意用户协议和隐私协议,请点击“同意”,开始使用新特锐能 App。</string>
    <string name="confirm_account">确认注销改账号吗?</string>
    <string name="immediate_cancellation">立即注销</string>
    <string name="account_not_recoverable">注销账户是不可恢复的操作,注销账户之后,您APP所有账户数据(包括昵称、头像、二维码照片等)都会被删除,且无法再找回。</string>
    <string name="account">账号</string>
    <string name="psw">密码</string>
</resources>
countrypicker/src/main/java/com/sahooz/library/countrypicker/Adapter.java
@@ -5,6 +5,7 @@
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.ViewGroup;
@@ -17,6 +18,7 @@
    private final LayoutInflater inflater;
    private PickCountryCallback callback = null;
    private final Context context;
    public Adapter(Context ctx) {
        inflater = LayoutInflater.from(ctx);
        context = ctx;
@@ -25,6 +27,7 @@
    public void setSelectedCountries(ArrayList<Country> selectedCountries) {
        this.selectedCountries = selectedCountries;
        notifyDataSetChanged();
    }
    public void setCallback(PickCountryCallback callback) {
@@ -38,8 +41,9 @@
    }
    private int itemHeight = -1;
    public void setItemHeight(float dp) {
        itemHeight = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, dp, context.getResources().getDisplayMetrics());
        itemHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, dp, context.getResources().getDisplayMetrics());
    }
    @SuppressLint("SetTextI18n")
@@ -49,13 +53,13 @@
        holder.ivFlag.setImageResource(country.flag);
        holder.tvName.setText(country.translate);
        holder.tvCode.setText("+" + country.code);
        if(itemHeight != -1) {
        if (itemHeight != -1) {
            ViewGroup.LayoutParams params = holder.itemView.getLayoutParams();
            params.height = itemHeight;
            holder.itemView.setLayoutParams(params);
        }
        holder.itemView.setOnClickListener(v -> {
            if(callback != null) callback.onPick(country);
            if (callback != null) callback.onPick(country);
        });
    }
countrypicker/src/main/java/com/sahooz/library/countrypicker/Country.java
@@ -1,6 +1,7 @@
package com.sahooz.library.countrypicker;
import android.content.Context;
import androidx.annotation.NonNull;
import android.text.TextUtils;
@@ -50,12 +51,12 @@
                '}';
    }
    public static ArrayList<Country> getAll(){
    public static ArrayList<Country> getAll() {
        return new ArrayList<>(countries);
    }
    public static Country fromJson(String json){
        if(TextUtils.isEmpty(json)) return null;
    public static Country fromJson(String json) {
        if (TextUtils.isEmpty(json)) return null;
        try {
            JSONObject jo = new JSONObject(json);
            return new Country(
@@ -99,25 +100,30 @@
        JSONArray ja = new JSONArray(sb.toString());
        for (int i = 0; i < ja.length(); i++) {
            JSONObject jo = ja.getJSONObject(i);
            if (jo.getInt("code") == 886) {
                //过滤掉台湾省
                continue;
            }
            int flag = 0;
            String translate = "";
            String locale = jo.getString("locale");
            if(!TextUtils.isEmpty(locale)) {
            if (!TextUtils.isEmpty(locale)) {
                flag = ctx.getResources().getIdentifier("flag_" + locale.toLowerCase(), "drawable", ctx.getPackageName());
                translate = ctx.getString(ctx.getResources().getIdentifier("name_" + locale.toLowerCase(), "string", ctx.getPackageName()));
            }
            String name = jo.getString("name");
            Locale defaultLoc = Locale.getDefault();
            boolean inChina = "zh".equalsIgnoreCase(defaultLoc.getLanguage());
            countries.add(
                new Country(
                    jo.getInt("code"),
                    name,
                    translate,
                    inChina ? jo.getString("pinyin") : name,
                    locale,
                    flag
                )
                    new Country(
                            jo.getInt("code"),
                            name,
                            translate,
                            inChina ? jo.getString("pinyin") : name,
                            locale,
                            flag
                    )
            );
        }
@@ -133,7 +139,8 @@
        return code;
    }
    @NonNull @Override
    @NonNull
    @Override
    public String getPinyin() {
        return pinyin;
    }