Refine Wi-Fi DPP fragments.

1. WifiDppQrCodeBaseFragment only declairs common UI components between fragments.
2. Initiate UI components in onViewCreated of each View.
3. Remove the only one usage of @NonNull since it should be used consistently
   throughout the class if we want to use it.
4. Use android.R.id for icon/title/summary

Bug: 120645817
Test: atest WifiDppConfiguratorActivityTest
      atest WifiDppEnrolleeActivityTest
      atest WifiDppQrCodeGeneratorFragmentTest
      atest WifiDppQrCodeScannerFragmentTest

Change-Id: I54f99a3072533cec46f0e47753ee0331fecf2ada
This commit is contained in:
Arc Wang
2018-12-27 17:00:15 +08:00
parent 1988fb75c6
commit 221b7e0b77
7 changed files with 124 additions and 206 deletions

View File

@@ -27,13 +27,13 @@
android:paddingEnd="16dp"> android:paddingEnd="16dp">
<ImageView <ImageView
android:id="@+id/header_icon" android:id="@android:id/icon"
android:layout_width="48dp" android:layout_width="48dp"
android:layout_height="48dp" android:layout_height="48dp"
android:scaleType="fitCenter"/> android:scaleType="fitCenter"/>
<TextView <TextView
android:id="@+id/title" android:id="@android:id/title"
style="@style/TextAppearance.EntityHeaderTitle" style="@style/TextAppearance.EntityHeaderTitle"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@@ -44,7 +44,7 @@
android:paddingEnd="32dp"/> android:paddingEnd="32dp"/>
<TextView <TextView
android:id="@+id/description" android:id="@android:id/summary"
style="@style/TextAppearance.EntityHeaderSummary" style="@style/TextAppearance.EntityHeaderSummary"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"

View File

@@ -45,6 +45,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:text="@string/wifi_dpp_could_not_detect_valid_qr_code"
android:visibility="invisible"
android:textColor="?android:attr/colorError"/> android:textColor="?android:attr/colorError"/>
</LinearLayout> </LinearLayout>

View File

@@ -17,6 +17,13 @@
package com.android.settings.wifi.dpp; package com.android.settings.wifi.dpp;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.android.internal.logging.nano.MetricsProto; import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R; import com.android.settings.R;
@@ -26,10 +33,11 @@ import com.android.settings.R;
* to the Wi-Fi network. * to the Wi-Fi network.
*/ */
public class WifiDppAddDeviceFragment extends WifiDppQrCodeBaseFragment { public class WifiDppAddDeviceFragment extends WifiDppQrCodeBaseFragment {
@Override private ProgressBar mProgressBar;
protected int getLayout() { private ImageView mWifiApPictureView;
return R.layout.wifi_dpp_add_device_fragment; private TextView mChooseDifferentNetwork;
} private Button mButtonLeft;
private Button mButtonRight;
@Override @Override
public int getMetricsCategory() { public int getMetricsCategory() {
@@ -37,7 +45,20 @@ public class WifiDppAddDeviceFragment extends WifiDppQrCodeBaseFragment {
} }
@Override @Override
public void onActivityCreated (Bundle savedInstanceState) { public final View onCreateView(LayoutInflater inflater, ViewGroup container,
super.onActivityCreated(savedInstanceState); Bundle savedInstanceState) {
return inflater.inflate(R.layout.wifi_dpp_add_device_fragment, container,
/* attachToRoot */ false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mProgressBar = view.findViewById(R.id.progress_bar);
mWifiApPictureView = view.findViewById(R.id.wifi_ap_picture_view);
mChooseDifferentNetwork = view.findViewById(R.id.choose_different_network);
mButtonLeft = view.findViewById(R.id.button_left);
mButtonRight = view.findViewById(R.id.button_right);
} }
} }

View File

@@ -17,6 +17,11 @@
package com.android.settings.wifi.dpp; package com.android.settings.wifi.dpp;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ListView;
import com.android.internal.logging.nano.MetricsProto; import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R; import com.android.settings.R;
@@ -26,10 +31,9 @@ import com.android.settings.R;
* {@code WifiDppConfiguratorActivity} to start with this fragment to choose a saved Wi-Fi network. * {@code WifiDppConfiguratorActivity} to start with this fragment to choose a saved Wi-Fi network.
*/ */
public class WifiDppChooseSavedWifiNetworkFragment extends WifiDppQrCodeBaseFragment { public class WifiDppChooseSavedWifiNetworkFragment extends WifiDppQrCodeBaseFragment {
@Override private ListView mSavedWifiNetworkList;
protected int getLayout() { private Button mButtonLeft;
return R.layout.wifi_dpp_choose_saved_wifi_network_fragment; private Button mButtonRight;
}
@Override @Override
public int getMetricsCategory() { public int getMetricsCategory() {
@@ -37,7 +41,18 @@ public class WifiDppChooseSavedWifiNetworkFragment extends WifiDppQrCodeBaseFrag
} }
@Override @Override
public void onActivityCreated (Bundle savedInstanceState) { public final View onCreateView(LayoutInflater inflater, ViewGroup container,
super.onActivityCreated(savedInstanceState); Bundle savedInstanceState) {
return inflater.inflate(R.layout.wifi_dpp_choose_saved_wifi_network_fragment, container,
/* attachToRoot */ false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mSavedWifiNetworkList = view.findViewById(R.id.saved_wifi_network_list);
mButtonLeft = view.findViewById(R.id.button_left);
mButtonRight = view.findViewById(R.id.button_right);
} }
} }

View File

@@ -17,25 +17,16 @@
package com.android.settings.wifi.dpp; package com.android.settings.wifi.dpp;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView; import android.widget.TextView;
import com.android.settings.core.InstrumentedFragment; import com.android.settings.core.InstrumentedFragment;
import com.android.settings.R; import com.android.settings.R;
/**
* TODO: b/120645817 should refine code to only initiate UI component in each child fragment.
*/
/** /**
* There are below 4 fragments for Wi-Fi DPP UI flow, to reduce redundant code of UI components, * There are below 4 fragments for Wi-Fi DPP UI flow, to reduce redundant code of UI components,
* this parent fragment instantiates all UI components and provides setting APIs for them. * this parent fragment instantiates common UI components
* *
* {@code WifiDppQrCodeScannerFragment} * {@code WifiDppQrCodeScannerFragment}
* {@code WifiDppQrCodeGeneratorFragment} * {@code WifiDppQrCodeGeneratorFragment}
@@ -43,135 +34,16 @@ import com.android.settings.R;
* {@code WifiDppAddDeviceFragment} * {@code WifiDppAddDeviceFragment}
*/ */
public abstract class WifiDppQrCodeBaseFragment extends InstrumentedFragment { public abstract class WifiDppQrCodeBaseFragment extends InstrumentedFragment {
private ImageView mHeaderIcon; protected ImageView mHeaderIcon;
private TextView mTitle; protected TextView mTitle;
private TextView mDescription; protected TextView mSummary;
private TextView mErrorMessage; //optional, for WifiDppQrCodeScannerFragment
private ListView mSavedWifiNetworkList; //optional, for WifiDppChooseSavedWifiNetworkFragment
private ProgressBar mProgressBar; //optional, for WifiDppAddDeviceFragment
private ImageView mWifiApPictureView; //optional, for WifiDppAddDeviceFragment
private TextView mChooseDifferentNetwork;//optional, for WifiDppAddDeviceFragment
private Button mButtonLeft; //optional, for WifiDppChooseSavedWifiNetworkFragment,
// WifiDppAddDeviceFragment
private Button mButtonRight; //optional, for WifiDppChooseSavedWifiNetworkFragment,
// WifiDppAddDeviceFragment
abstract protected int getLayout();
@Override @Override
public final void onCreate(Bundle savedInstanceState) { public void onViewCreated(View view, Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onViewCreated(view, savedInstanceState);
}
@Override mHeaderIcon = view.findViewById(android.R.id.icon);
public final View onCreateView(LayoutInflater inflater, ViewGroup container, mTitle = view.findViewById(android.R.id.title);
Bundle savedInstanceState) { mSummary = view.findViewById(android.R.id.summary);
View view = inflater.inflate(getLayout(), container, false);
initView(view);
return view;
}
private void initView(View view) {
mHeaderIcon = view.findViewById(R.id.header_icon);
mTitle = view.findViewById(R.id.title);
mDescription = view.findViewById(R.id.description);
mErrorMessage = view.findViewById(R.id.error_message);
mSavedWifiNetworkList = view.findViewById(R.id.saved_wifi_network_list);
mProgressBar = view.findViewById(R.id.progress_bar);
mWifiApPictureView = view.findViewById(R.id.wifi_ap_picture_view);
mChooseDifferentNetwork = view.findViewById(R.id.choose_different_network);
mButtonLeft = view.findViewById(R.id.button_left);
mButtonRight = view.findViewById(R.id.button_right);
}
protected void setHeaderIconImageResource(int resId) {
mHeaderIcon.setImageResource(resId);
}
protected void setTitle(String title) {
mTitle.setText(title);
}
protected void setDescription(String description) {
mDescription.setText(description);
}
/** optional, for WifiDppQrCodeScannerFragment */
protected void showErrorMessage(boolean show) {
if (mErrorMessage != null) {
mErrorMessage.setVisibility(show ? View.VISIBLE : View.INVISIBLE);
}
}
/** optional, for WifiDppQrCodeScannerFragment */
protected void setErrorMessage(String errorMessage) {
if (mErrorMessage != null) {
mErrorMessage.setText(errorMessage);
}
}
/**
* optional, for WifiDppChooseSavedWifiNetworkFragment,
* WifiDppAddDeviceFragment
*/
protected void setLeftButtonText(String text) {
if (mButtonLeft != null) {
mButtonLeft.setText(text);
}
}
/**
* optional, for WifiDppChooseSavedWifiNetworkFragment,
* WifiDppAddDeviceFragment
*/
protected void setRightButtonText(String text) {
if (mButtonRight != null) {
mButtonRight.setText(text);
}
}
/**
* optional, for WifiDppChooseSavedWifiNetworkFragment,
* WifiDppAddDeviceFragment
*/
protected void hideLeftButton() {
if (mButtonLeft != null) {
mButtonLeft.setVisibility(View.INVISIBLE);
}
}
/**
* optional, for WifiDppChooseSavedWifiNetworkFragment,
* WifiDppAddDeviceFragment
*/
protected void hideRightButton() {
if (mButtonRight != null) {
mButtonRight.setVisibility(View.INVISIBLE);
}
}
/**
* optional, for WifiDppChooseSavedWifiNetworkFragment,
* WifiDppAddDeviceFragment
*/
protected void setLeftButtonOnClickListener(View.OnClickListener listener) {
if (mButtonLeft != null) {
mButtonLeft.setOnClickListener(listener);
}
}
/**
* optional, for WifiDppChooseSavedWifiNetworkFragment,
* WifiDppAddDeviceFragment
*/
protected void setRightButtonOnClickListener(View.OnClickListener listener) {
if (mButtonRight != null) {
mButtonRight.setOnClickListener(listener);
}
} }
} }

View File

@@ -21,10 +21,12 @@ import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log; import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;
import com.android.internal.logging.nano.MetricsProto; import com.android.internal.logging.nano.MetricsProto;
@@ -43,11 +45,6 @@ public class WifiDppQrCodeGeneratorFragment extends WifiDppQrCodeBaseFragment {
private ImageView mQrCodeView; private ImageView mQrCodeView;
private String mQrCode; private String mQrCode;
@Override
protected int getLayout() {
return R.layout.wifi_dpp_qrcode_generator_fragment;
}
@Override @Override
public int getMetricsCategory() { public int getMetricsCategory() {
return MetricsProto.MetricsEvent.SETTINGS_WIFI_DPP_CONFIGURATOR; return MetricsProto.MetricsEvent.SETTINGS_WIFI_DPP_CONFIGURATOR;
@@ -63,25 +60,12 @@ public class WifiDppQrCodeGeneratorFragment extends WifiDppQrCodeBaseFragment {
public void onActivityCreated(Bundle savedInstanceState) { public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState); super.onActivityCreated(savedInstanceState);
setHeaderIconImageResource(R.drawable.ic_qrcode_24dp);
WifiNetworkConfig wifiNetworkConfig = ((WifiNetworkConfig.Retriever) getActivity())
.getWifiNetworkConfig();
if (!WifiNetworkConfig.isValidConfig(wifiNetworkConfig)) {
throw new IllegalArgumentException("Invalid Wi-Fi network for configuring");
}
setTitle(getString(R.string.wifi_dpp_share_wifi));
setDescription(getString(R.string.wifi_dpp_scan_qr_code_with_another_device,
wifiNetworkConfig.getSsid()));
setHasOptionsMenu(true); setHasOptionsMenu(true);
ActionBar actionBar = getActivity().getActionBar(); final ActionBar actionBar = getActivity().getActionBar();
if (actionBar != null) { if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.show(); actionBar.show();
} }
mQrCode = wifiNetworkConfig.getQrCode();
setQrCode();
} }
@Override @Override
@@ -118,10 +102,31 @@ public class WifiDppQrCodeGeneratorFragment extends WifiDppQrCodeBaseFragment {
} }
} }
@Override
public final View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.wifi_dpp_qrcode_generator_fragment, container,
/* attachToRoot */ false);
}
@Override @Override
public void onViewCreated(View view, Bundle savedInstanceState) { public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
mQrCodeView = view.findViewById(R.id.qrcode_view); mQrCodeView = view.findViewById(R.id.qrcode_view);
mHeaderIcon.setImageResource(R.drawable.ic_qrcode_24dp);
WifiNetworkConfig wifiNetworkConfig = ((WifiNetworkConfig.Retriever) getActivity())
.getWifiNetworkConfig();
if (!WifiNetworkConfig.isValidConfig(wifiNetworkConfig)) {
throw new IllegalStateException("Invalid Wi-Fi network for configuring");
}
mTitle.setText(R.string.wifi_dpp_share_wifi);
mSummary.setText(getString(R.string.wifi_dpp_scan_qr_code_with_another_device,
wifiNetworkConfig.getSsid()));
mQrCode = wifiNetworkConfig.getQrCode();
setQrCode();
} }
private void setQrCode() { private void setQrCode() {

View File

@@ -16,7 +16,6 @@
package com.android.settings.wifi.dpp; package com.android.settings.wifi.dpp;
import android.annotation.Nullable;
import android.app.ActionBar; import android.app.ActionBar;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
@@ -29,11 +28,14 @@ import android.os.Handler;
import android.os.Message; import android.os.Message;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Size; import android.util.Size;
import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
import android.view.TextureView; import android.view.TextureView;
import android.view.TextureView.SurfaceTextureListener; import android.view.TextureView.SurfaceTextureListener;
import android.view.View; import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.android.internal.logging.nano.MetricsProto; import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R; import com.android.settings.R;
@@ -67,6 +69,7 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl
private QrCamera mCamera; private QrCamera mCamera;
private TextureView mTextureView; private TextureView mTextureView;
private QrDecorateView mDecorateView; private QrDecorateView mDecorateView;
private TextView mErrorMessage;
/** true if the fragment working for configurator, false enrollee*/ /** true if the fragment working for configurator, false enrollee*/
private final boolean mIsConfiguratorMode; private final boolean mIsConfiguratorMode;
@@ -77,11 +80,6 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl
/** QR code data scanned by camera */ /** QR code data scanned by camera */
private WifiQrCode mWifiQrCode; private WifiQrCode mWifiQrCode;
@Override
protected int getLayout() {
return R.layout.wifi_dpp_qrcode_scanner_fragment;
}
@Override @Override
public int getMetricsCategory() { public int getMetricsCategory() {
if (mIsConfiguratorMode) { if (mIsConfiguratorMode) {
@@ -127,37 +125,11 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl
public void onActivityCreated(Bundle savedInstanceState) { public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState); super.onActivityCreated(savedInstanceState);
setHeaderIconImageResource(R.drawable.ic_scan_24dp);
if (mIsConfiguratorMode) {
setTitle(getString(R.string.wifi_dpp_add_device_to_network));
WifiNetworkConfig wifiNetworkConfig = ((WifiNetworkConfig.Retriever) getActivity())
.getWifiNetworkConfig();
if (!WifiNetworkConfig.isValidConfig(wifiNetworkConfig)) {
throw new IllegalArgumentException("Invalid Wi-Fi network for configuring");
}
setDescription(getString(R.string.wifi_dpp_center_qr_code, wifiNetworkConfig.getSsid()));
} else {
setTitle(getString(R.string.wifi_dpp_scan_qr_code));
String description;
if (TextUtils.isEmpty(mSsid)) {
description = getString(R.string.wifi_dpp_scan_qr_code_join_unknown_network, mSsid);
} else {
description = getString(R.string.wifi_dpp_scan_qr_code_join_network, mSsid);
}
setDescription(description);
}
final ActionBar actionBar = getActivity().getActionBar(); final ActionBar actionBar = getActivity().getActionBar();
if (actionBar != null) { if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.show(); actionBar.show();
} }
setErrorMessage(getString(R.string.wifi_dpp_could_not_detect_valid_qr_code));
showErrorMessage(false);
} }
@Override @Override
@@ -177,13 +149,45 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl
} }
@Override @Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { public final View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.wifi_dpp_qrcode_scanner_fragment, container,
/* attachToRoot */ false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
mTextureView = (TextureView) view.findViewById(R.id.preview_view); mTextureView = (TextureView) view.findViewById(R.id.preview_view);
mTextureView.setSurfaceTextureListener(this); mTextureView.setSurfaceTextureListener(this);
mDecorateView = (QrDecorateView) view.findViewById(R.id.decorate_view); mDecorateView = (QrDecorateView) view.findViewById(R.id.decorate_view);
mHeaderIcon.setImageResource(R.drawable.ic_scan_24dp);
if (mIsConfiguratorMode) {
mTitle.setText(R.string.wifi_dpp_add_device_to_network);
WifiNetworkConfig wifiNetworkConfig = ((WifiNetworkConfig.Retriever) getActivity())
.getWifiNetworkConfig();
if (!WifiNetworkConfig.isValidConfig(wifiNetworkConfig)) {
throw new IllegalStateException("Invalid Wi-Fi network for configuring");
}
mSummary.setText(getString(R.string.wifi_dpp_center_qr_code,
wifiNetworkConfig.getSsid()));
} else {
mTitle.setText(R.string.wifi_dpp_scan_qr_code);
String description;
if (TextUtils.isEmpty(mSsid)) {
description = getString(R.string.wifi_dpp_scan_qr_code_join_unknown_network, mSsid);
} else {
description = getString(R.string.wifi_dpp_scan_qr_code_join_network, mSsid);
}
mSummary.setText(description);
}
mErrorMessage = view.findViewById(R.id.error_message);
} }
@Override @Override
@@ -321,9 +325,8 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl
} }
} }
@Override
public void showErrorMessage(boolean show) { public void showErrorMessage(boolean show) {
super.showErrorMessage(show); mErrorMessage.setVisibility(show ? View.VISIBLE : View.INVISIBLE);
if (show) { if (show) {
mHandler.removeMessages(MESSAGE_HIDE_ERROR_MESSAGE); mHandler.removeMessages(MESSAGE_HIDE_ERROR_MESSAGE);