From 841fb5e078eba1e061a4ab55f0e0feb844a32cf4 Mon Sep 17 00:00:00 2001 From: Alberto Geniola Date: Sat, 22 Jan 2022 11:38:33 +0100 Subject: [PATCH] Segregated Meross cloud login from HA addon login --- .../albertogeniola/merossconf/Constants.java | 5 ++ .../merossconf/MainActivity.java | 22 ++++--- .../ui/fragments/account/AccountFragment.java | 42 ++++++++++--- .../ui/fragments/login/LoginFragment.java | 43 +++++++++++-- app/src/main/res/drawable/ha_logo.png | Bin 0 -> 16752 bytes app/src/main/res/drawable/meross_logo.png | Bin 0 -> 9438 bytes app/src/main/res/layout/fragment_account.xml | 58 ++++++++++-------- app/src/main/res/layout/fragment_login.xml | 14 ++--- .../main/res/navigation/mobile_navigation.xml | 2 +- app/src/main/res/values/strings.xml | 7 ++- 10 files changed, 140 insertions(+), 53 deletions(-) create mode 100644 app/src/main/res/drawable/ha_logo.png create mode 100644 app/src/main/res/drawable/meross_logo.png diff --git a/app/src/main/java/com/albertogeniola/merossconf/Constants.java b/app/src/main/java/com/albertogeniola/merossconf/Constants.java index b25f4e9..0dd8255 100644 --- a/app/src/main/java/com/albertogeniola/merossconf/Constants.java +++ b/app/src/main/java/com/albertogeniola/merossconf/Constants.java @@ -2,4 +2,9 @@ public class Constants { public static final String LOG_TAG = "Custom Meross Pairer"; + public static final String MEROSS_CLOUD_EP = "https://iot.meross.com"; + + public static final String HA_ADDON_DEFAULT_EMAIL = "meross_local@local"; + public static final String HA_ADDON_DEFAULT_PASSWORD = "Changeme!"; + } diff --git a/app/src/main/java/com/albertogeniola/merossconf/MainActivity.java b/app/src/main/java/com/albertogeniola/merossconf/MainActivity.java index cdb6001..f0ea5c3 100644 --- a/app/src/main/java/com/albertogeniola/merossconf/MainActivity.java +++ b/app/src/main/java/com/albertogeniola/merossconf/MainActivity.java @@ -6,7 +6,6 @@ import android.content.IntentFilter; import android.net.ConnectivityManager; import android.os.Bundle; -import android.os.Handler; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -42,7 +41,7 @@ public class MainActivity extends AppCompatActivity { private TextView wifiMerossWarning; private TextView locationTextView; private LinearLayout wifiLocationStatusLayout; - + private boolean mActiveFragmentsRequireWifiLocationWarn = false; private MenuItem mPairMenuItem, mDeviceMenuItem; @Override @@ -127,11 +126,20 @@ private void updateLocationStatus(boolean locationEnabled) { updateStatusBarVisibility(); } - private void updateStatusBarVisibility() { - wifiLocationStatusLayout.setVisibility( - wifiTextView.getVisibility()==View.VISIBLE || - locationTextView.getVisibility()==View.VISIBLE || - wifiMerossWarning.getVisibility()==View.VISIBLE ? View.VISIBLE : View.GONE); + public void setWifiLocationWarnRequired(boolean enabled) { + mActiveFragmentsRequireWifiLocationWarn = enabled; + updateStatusBarVisibility(); + } + + public void updateStatusBarVisibility() { + if (mActiveFragmentsRequireWifiLocationWarn) { + wifiLocationStatusLayout.setVisibility( + wifiTextView.getVisibility() == View.VISIBLE || + locationTextView.getVisibility() == View.VISIBLE || + wifiMerossWarning.getVisibility() == View.VISIBLE ? View.VISIBLE : View.GONE); + } else { + wifiLocationStatusLayout.setVisibility(View.GONE); + } } @Override diff --git a/app/src/main/java/com/albertogeniola/merossconf/ui/fragments/account/AccountFragment.java b/app/src/main/java/com/albertogeniola/merossconf/ui/fragments/account/AccountFragment.java index 30cdda7..2cbd85f 100644 --- a/app/src/main/java/com/albertogeniola/merossconf/ui/fragments/account/AccountFragment.java +++ b/app/src/main/java/com/albertogeniola/merossconf/ui/fragments/account/AccountFragment.java @@ -7,6 +7,7 @@ import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; +import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; @@ -18,13 +19,13 @@ import androidx.navigation.fragment.NavHostFragment; import com.albertogeniola.merossconf.AndroidPreferencesManager; +import com.albertogeniola.merossconf.Constants; +import com.albertogeniola.merossconf.MainActivity; import com.albertogeniola.merossconf.R; import com.albertogeniola.merossconf.model.HttpClientManager; import com.albertogeniola.merossconf.ui.MainActivityViewModel; +import com.albertogeniola.merossconf.ui.fragments.login.LoginFragment; import com.albertogeniola.merosslib.model.http.ApiCredentials; -import com.albertogeniola.merosslib.model.http.ErrorCodes; -import com.albertogeniola.merosslib.model.http.exceptions.HttpApiException; -import com.albertogeniola.merosslib.model.http.exceptions.HttpApiTokenException; import org.eclipse.paho.client.mqttv3.util.Strings; @@ -39,7 +40,8 @@ public View onCreateView(@NonNull LayoutInflater inflater, final EditText httpTokenEditText = root.findViewById(R.id.httpTokenEditText); final EditText mqttKeyEditText = root.findViewById(R.id.mqttKeyEditText); final Button httpLogoutButton = root.findViewById(R.id.httpLogoutButton); - final Button httpLoginButton = root.findViewById(R.id.httpLoginButton); + final Button haBrokerLoginButton = root.findViewById(R.id.haBrokerLoginButton); + final Button merossCloudLoginButton = root.findViewById(R.id.merossCloudLoginButton); final CardView loginCardView = root.findViewById(R.id.loginCard); final Button manualSetupButton = root.findViewById(R.id.setManualButton); @@ -79,15 +81,35 @@ public void onChanged(ApiCredentials apiCredentials) { httpLogoutButton.setEnabled(apiCredentials != null); httpInfoCard.setVisibility(apiCredentials == null ? View.GONE : View.VISIBLE); loginCardView.setVisibility(apiCredentials == null ? View.VISIBLE : View.GONE); - httpLoginButton.setEnabled(apiCredentials == null); + haBrokerLoginButton.setEnabled(apiCredentials == null); + merossCloudLoginButton.setEnabled(apiCredentials == null); manualSetupButton.setVisibility(apiCredentials == null ? View.VISIBLE : View.GONE); } }); - httpLoginButton.setOnClickListener(new View.OnClickListener() { + haBrokerLoginButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - NavHostFragment.findNavController(AccountFragment.this).navigate(R.id.login_fragment); + Bundle args = new Bundle(); + args.putBoolean(LoginFragment.Args.ENABLE_BROKER_DISCOVERY, true); + args.putString(LoginFragment.Args.HTTP_BROKER_EMAIL, Constants.HA_ADDON_DEFAULT_EMAIL); + args.putString(LoginFragment.Args.HTTP_BROKER_PASSWORD, Constants.HA_ADDON_DEFAULT_PASSWORD); + args.putInt(LoginFragment.Args.INTRO_TEXT_RESOURCE_ID, R.string.login_intro_ha_broker); + args.putInt(LoginFragment.Args.INTRO_IMAGE_RESOURCE_ID, R.drawable.ha_logo); + args.putBoolean(LoginFragment.Args.REQUIRES_WIFI_LOCATION, true); + NavHostFragment.findNavController(AccountFragment.this).navigate(R.id.login_fragment, args); + } + }); + merossCloudLoginButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Bundle args = new Bundle(); + args.putBoolean(LoginFragment.Args.ENABLE_BROKER_DISCOVERY, false); + args.putString(LoginFragment.Args.HTTP_BROKER_URL, Constants.MEROSS_CLOUD_EP); + args.putInt(LoginFragment.Args.INTRO_TEXT_RESOURCE_ID, R.string.login_intro_text_meross); + args.putInt(LoginFragment.Args.INTRO_IMAGE_RESOURCE_ID, R.drawable.meross_logo); + args.putBoolean(LoginFragment.Args.REQUIRES_WIFI_LOCATION, false); + NavHostFragment.findNavController(AccountFragment.this).navigate(R.id.login_fragment, args); } }); @@ -143,4 +165,10 @@ public void onClick(DialogInterface dialog, int which) { return root; } + @Override + public void onResume() { + super.onResume(); + ((MainActivity)requireActivity()).setWifiLocationWarnRequired(false); + } + } diff --git a/app/src/main/java/com/albertogeniola/merossconf/ui/fragments/login/LoginFragment.java b/app/src/main/java/com/albertogeniola/merossconf/ui/fragments/login/LoginFragment.java index e9d00eb..37207ec 100644 --- a/app/src/main/java/com/albertogeniola/merossconf/ui/fragments/login/LoginFragment.java +++ b/app/src/main/java/com/albertogeniola/merossconf/ui/fragments/login/LoginFragment.java @@ -4,7 +4,6 @@ import android.content.Context; import android.net.nsd.NsdManager; import android.net.nsd.NsdServiceInfo; -import android.net.wifi.WifiManager; import android.os.Bundle; import android.os.Handler; import android.os.Looper; @@ -14,10 +13,11 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; import android.widget.Toast; import androidx.annotation.Nullable; @@ -27,6 +27,7 @@ import com.albertogeniola.merossconf.AndroidPreferencesManager; import com.albertogeniola.merossconf.AndroidUtils; +import com.albertogeniola.merossconf.MainActivity; import com.albertogeniola.merossconf.R; import com.albertogeniola.merossconf.model.HttpClientManager; import com.albertogeniola.merossconf.ui.MainActivityViewModel; @@ -50,7 +51,9 @@ public class LoginFragment extends Fragment { private static final String TAG = "Login"; // Instance attributes - private boolean mDiscoveryInProgress; + private boolean mDiscoveryInProgress = false; + private boolean mDiscoveryEnabled = false; + private boolean mRequiresWifiLocation = false; private NsdManager mNsdManager; private TextInputLayout mHttpHostnameInputLayout; private EditText mHttpHostnameEditText; @@ -58,6 +61,8 @@ public class LoginFragment extends Fragment { private EditText mHttpPasswordEditText; private MaterialButton mLoginButton; private MaterialButton mDiscoveryButton; + private TextView httpLoginIntroText; + private ImageView loginLogo; private Timer mTimer; private Handler mUiHandler; @@ -65,6 +70,15 @@ public class LoginFragment extends Fragment { private CircularProgressIndicator mSearchProgress; private IndeterminateDrawable mProgressIndicatorDrawable; + public static class Args { + public static final String HTTP_BROKER_URL = "com.albertogeniola.merossconf.ui.fragments.account.AccountFragment.Args.HTTP_BROKER_URL"; + public static final String HTTP_BROKER_EMAIL = "com.albertogeniola.merossconf.ui.fragments.account.AccountFragment.Args.HTTP_BROKER_EMAIL"; + public static final String HTTP_BROKER_PASSWORD = "com.albertogeniola.merossconf.ui.fragments.account.AccountFragment.Args.HTTP_BROKER_PASSWORD"; + public static final String ENABLE_BROKER_DISCOVERY = "com.albertogeniola.merossconf.ui.fragments.account.AccountFragment.Args.ENABLE_BROKER_DISCOVERY"; + public static final String INTRO_TEXT_RESOURCE_ID = "com.albertogeniola.merossconf.ui.fragments.account.AccountFragment.Args.INTRO_TEXT_RESOURCE_ID"; + public static final String INTRO_IMAGE_RESOURCE_ID = "com.albertogeniola.merossconf.ui.fragments.account.AccountFragment.Args.INTRO_IMAGE_RESOURCE_ID"; + public static final String REQUIRES_WIFI_LOCATION = "com.albertogeniola.merossconf.ui.fragments.account.AccountFragment.Args.REQUIRES_WIFI_LOCATION"; + } @Override public void onCreate(Bundle savedInstanceState) { @@ -87,6 +101,8 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, mHttpUsernameEditText = ((TextInputLayout)view.findViewById(R.id.httpUsernameEditText)).getEditText(); mLoginButton = view.findViewById(R.id.loginButton); mDiscoveryButton = view.findViewById(R.id.discoveryButton); + httpLoginIntroText = view.findViewById(R.id.httpLoginIntroText); + loginLogo = view.findViewById(R.id.loginLogo); // Configure HostEditText for progress showing mSearchProgress = new CircularProgressIndicator(this.requireActivity(), null); @@ -125,6 +141,22 @@ public void onClick(View view) { showPasswordCheckBox.setChecked(false); mHttpPasswordEditText.setTransformationMethod(PasswordTransformationMethod.getInstance()); + // Configure the UI based on received args, if any. + Bundle args = getArguments(); + if (args == null) + args = new Bundle(); + + mRequiresWifiLocation = args.getBoolean(Args.REQUIRES_WIFI_LOCATION, false); + mDiscoveryEnabled = args.getBoolean(Args.ENABLE_BROKER_DISCOVERY, false); + + mHttpHostnameEditText.setText(args.getString(Args.HTTP_BROKER_URL, "")); + mHttpUsernameEditText.setText(args.getString(Args.HTTP_BROKER_EMAIL, "")); + mHttpPasswordEditText.setText(args.getString(Args.HTTP_BROKER_PASSWORD, "")); + mDiscoveryButton.setEnabled(mDiscoveryEnabled); + mDiscoveryButton.setVisibility(mDiscoveryEnabled ? View.VISIBLE : View.INVISIBLE); + httpLoginIntroText.setText(args.getInt(Args.INTRO_TEXT_RESOURCE_ID, R.string.login_intro_text)); + loginLogo.setImageResource(args.getInt(Args.INTRO_IMAGE_RESOURCE_ID, R.drawable.login_icon)); + return view; } @@ -193,7 +225,10 @@ public void run() { @Override public void onResume() { super.onResume(); - startApiDiscovery(); + ((MainActivity)requireActivity()).setWifiLocationWarnRequired(mRequiresWifiLocation); + + if (mDiscoveryEnabled) + startApiDiscovery(); } @Override diff --git a/app/src/main/res/drawable/ha_logo.png b/app/src/main/res/drawable/ha_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a81480231df6351b6c8705dc76bbb8999d02e3d9 GIT binary patch literal 16752 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/fragment_account.xml b/app/src/main/res/layout/fragment_account.xml index 014b31d..4879cc9 100644 --- a/app/src/main/res/layout/fragment_account.xml +++ b/app/src/main/res/layout/fragment_account.xml @@ -15,10 +15,11 @@ android:layout_margin="10dp"> + + android:hint="API Endpoint"> + + android:text="N/A" + android:textIsSelectable="true" /> + android:hint="User ID"> + + android:text="N/A" + android:textIsSelectable="true" /> + android:hint="HTTP Token"> + + android:text="N/A" + android:textIsSelectable="true" /> + android:hint="MQTT Key"> + + android:text="N/A" /> + - - android:text="Homeassistant Login" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_login.xml b/app/src/main/res/layout/fragment_login.xml index ae5e550..7a7dd36 100644 --- a/app/src/main/res/layout/fragment_login.xml +++ b/app/src/main/res/layout/fragment_login.xml @@ -28,7 +28,7 @@ android:layout_margin="16dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/imageView2" + app:layout_constraintTop_toBottomOf="@+id/loginLogo" tools:context=".LoginActivity"> + android:layout_height="wrap_content" /> + android:layout_height="wrap_content" /> + app:layout_constraintTop_toBottomOf="@+id/httpLoginIntroText" /> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 882edfc..89367ad 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -66,8 +66,11 @@ Devices (coming soon!) DRAWER OPEN DRAWER CLOSE - Local API Login - Log-in to the Local API broker. Make sure your HomeAssistant addon is running (started) and double check the credentials from within the Addon configuration page. + API Login + Manual API Setup + Log-in to the HTTP API broker. + Fill in your credentials as you would do in the Official Meross app to proceed. + Make sure the Meross Local Broker (on HomeAssistant) Addon is started and log-in using the credentials configured in the configuration section of that Addon. User Key