Merge "Load regulatory info from /data/misc" into oc-dr1-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
f964e8c3b2
@@ -20,15 +20,20 @@ import android.app.Activity;
|
|||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.BitmapFactory;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.SystemProperties;
|
import android.os.SystemProperties;
|
||||||
|
import android.support.annotation.VisibleForTesting;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.Gravity;
|
import android.view.Gravity;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@link Activity} that displays regulatory information for the "Regulatory information"
|
* {@link Activity} that displays regulatory information for the "Regulatory information"
|
||||||
* preference item, and when "*#07#" is dialed on the Phone keypad. To enable this feature,
|
* preference item, and when "*#07#" is dialed on the Phone keypad. To enable this feature,
|
||||||
@@ -41,7 +46,12 @@ import android.widget.TextView;
|
|||||||
*/
|
*/
|
||||||
public class RegulatoryInfoDisplayActivity extends Activity implements
|
public class RegulatoryInfoDisplayActivity extends Activity implements
|
||||||
DialogInterface.OnDismissListener {
|
DialogInterface.OnDismissListener {
|
||||||
|
|
||||||
private final String REGULATORY_INFO_RESOURCE = "regulatory_info";
|
private final String REGULATORY_INFO_RESOURCE = "regulatory_info";
|
||||||
|
private static final String DEFAULT_REGULATORY_INFO_FILEPATH =
|
||||||
|
"/data/misc/elabel/regulatory_info.png";
|
||||||
|
private static final String REGULATORY_INFO_FILEPATH_TEMPLATE =
|
||||||
|
"/data/misc/elabel/regulatory_info_%s.png";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Display the regulatory info graphic in a dialog window.
|
* Display the regulatory info graphic in a dialog window.
|
||||||
@@ -60,7 +70,18 @@ public class RegulatoryInfoDisplayActivity extends Activity implements
|
|||||||
.setOnDismissListener(this);
|
.setOnDismissListener(this);
|
||||||
|
|
||||||
boolean regulatoryInfoDrawableExists = false;
|
boolean regulatoryInfoDrawableExists = false;
|
||||||
int resId = getResourceId();
|
|
||||||
|
final String regulatoryInfoFile = getRegulatoryInfoImageFileName();
|
||||||
|
final Bitmap regulatoryInfoBitmap = BitmapFactory.decodeFile(regulatoryInfoFile);
|
||||||
|
|
||||||
|
if (regulatoryInfoBitmap != null) {
|
||||||
|
regulatoryInfoDrawableExists = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int resId = 0;
|
||||||
|
if (!regulatoryInfoDrawableExists) {
|
||||||
|
resId = getResourceId();
|
||||||
|
}
|
||||||
if (resId != 0) {
|
if (resId != 0) {
|
||||||
try {
|
try {
|
||||||
Drawable d = getDrawable(resId);
|
Drawable d = getDrawable(resId);
|
||||||
@@ -77,8 +98,12 @@ public class RegulatoryInfoDisplayActivity extends Activity implements
|
|||||||
|
|
||||||
if (regulatoryInfoDrawableExists) {
|
if (regulatoryInfoDrawableExists) {
|
||||||
View view = getLayoutInflater().inflate(R.layout.regulatory_info, null);
|
View view = getLayoutInflater().inflate(R.layout.regulatory_info, null);
|
||||||
ImageView image = (ImageView) view.findViewById(R.id.regulatoryInfo);
|
ImageView image = view.findViewById(R.id.regulatoryInfo);
|
||||||
|
if (regulatoryInfoBitmap != null) {
|
||||||
|
image.setImageBitmap(regulatoryInfoBitmap);
|
||||||
|
} else {
|
||||||
image.setImageResource(resId);
|
image.setImageResource(resId);
|
||||||
|
}
|
||||||
builder.setView(view);
|
builder.setView(view);
|
||||||
builder.show();
|
builder.show();
|
||||||
} else if (regulatoryText.length() > 0) {
|
} else if (regulatoryText.length() > 0) {
|
||||||
@@ -99,7 +124,7 @@ public class RegulatoryInfoDisplayActivity extends Activity implements
|
|||||||
REGULATORY_INFO_RESOURCE, "drawable", getPackageName());
|
REGULATORY_INFO_RESOURCE, "drawable", getPackageName());
|
||||||
|
|
||||||
// When hardware sku property exists, use regulatory_info_<sku> resource if valid.
|
// When hardware sku property exists, use regulatory_info_<sku> resource if valid.
|
||||||
String sku = SystemProperties.get("ro.boot.hardware.sku", "");
|
final String sku = getSku();
|
||||||
if (!TextUtils.isEmpty(sku)) {
|
if (!TextUtils.isEmpty(sku)) {
|
||||||
String regulatory_info_res = REGULATORY_INFO_RESOURCE + "_" + sku.toLowerCase();
|
String regulatory_info_res = REGULATORY_INFO_RESOURCE + "_" + sku.toLowerCase();
|
||||||
int id = getResources().getIdentifier(
|
int id = getResources().getIdentifier(
|
||||||
@@ -115,4 +140,20 @@ public class RegulatoryInfoDisplayActivity extends Activity implements
|
|||||||
public void onDismiss(DialogInterface dialog) {
|
public void onDismiss(DialogInterface dialog) {
|
||||||
finish(); // close the activity
|
finish(); // close the activity
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
public static String getSku() {
|
||||||
|
return SystemProperties.get("ro.boot.hardware.sku", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
public static String getRegulatoryInfoImageFileName() {
|
||||||
|
final String sku = getSku();
|
||||||
|
if (TextUtils.isEmpty(sku)) {
|
||||||
|
return DEFAULT_REGULATORY_INFO_FILEPATH;
|
||||||
|
} else {
|
||||||
|
return String.format(Locale.US, REGULATORY_INFO_FILEPATH_TEMPLATE,
|
||||||
|
sku.toLowerCase());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -16,6 +16,25 @@
|
|||||||
|
|
||||||
package com.android.settings;
|
package com.android.settings;
|
||||||
|
|
||||||
|
import android.app.Instrumentation;
|
||||||
|
import android.app.UiAutomation;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.pm.ResolveInfo;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.support.test.InstrumentationRegistry;
|
||||||
|
import android.support.test.filters.SmallTest;
|
||||||
|
import android.support.test.runner.AndroidJUnit4;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
import static android.support.test.espresso.Espresso.onView;
|
import static android.support.test.espresso.Espresso.onView;
|
||||||
import static android.support.test.espresso.assertion.ViewAssertions.matches;
|
import static android.support.test.espresso.assertion.ViewAssertions.matches;
|
||||||
import static android.support.test.espresso.matcher.RootMatchers.isDialog;
|
import static android.support.test.espresso.matcher.RootMatchers.isDialog;
|
||||||
@@ -23,28 +42,19 @@ import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
|
|||||||
import static android.support.test.espresso.matcher.ViewMatchers.withId;
|
import static android.support.test.espresso.matcher.ViewMatchers.withId;
|
||||||
import static junit.framework.Assert.fail;
|
import static junit.framework.Assert.fail;
|
||||||
|
|
||||||
import android.app.Instrumentation;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.pm.ResolveInfo;
|
|
||||||
import android.support.test.InstrumentationRegistry;
|
|
||||||
import android.support.test.filters.SmallTest;
|
|
||||||
import android.support.test.runner.AndroidJUnit4;
|
|
||||||
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
|
|
||||||
@RunWith(AndroidJUnit4.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
@SmallTest
|
@SmallTest
|
||||||
public class RegulatoryInfoDisplayActivityTest {
|
public class RegulatoryInfoDisplayActivityTest {
|
||||||
|
private static final String TAG = "RegulatoryInfoTest";
|
||||||
|
|
||||||
private Instrumentation mInstrumentation;
|
private Instrumentation mInstrumentation;
|
||||||
private Intent mRegulatoryInfoIntent;
|
private Intent mRegulatoryInfoIntent;
|
||||||
|
private UiAutomation mUiAutomation;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mInstrumentation = InstrumentationRegistry.getInstrumentation();
|
mInstrumentation = InstrumentationRegistry.getInstrumentation();
|
||||||
|
mUiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
|
||||||
mRegulatoryInfoIntent = new Intent("android.settings.SHOW_REGULATORY_INFO")
|
mRegulatoryInfoIntent = new Intent("android.settings.SHOW_REGULATORY_INFO")
|
||||||
.addCategory(Intent.CATEGORY_DEFAULT)
|
.addCategory(Intent.CATEGORY_DEFAULT)
|
||||||
.setPackage(mInstrumentation.getTargetContext().getPackageName());
|
.setPackage(mInstrumentation.getTargetContext().getPackageName());
|
||||||
@@ -88,4 +98,55 @@ public class RegulatoryInfoDisplayActivityTest {
|
|||||||
.check(matches(isDisplayed()));
|
.check(matches(isDisplayed()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void launchRegulatoryInfo_withInfoImage_shouldDisplay() throws IOException {
|
||||||
|
// TODO: Remove "setenforce 0" when selinux rules is updated to give read permission for
|
||||||
|
// regulatory info.
|
||||||
|
mUiAutomation.executeShellCommand("setenforce 0");
|
||||||
|
|
||||||
|
final boolean tempFileCreated = ensureRegulatoryInfoImageExists();
|
||||||
|
try {
|
||||||
|
final Context context = mInstrumentation.getTargetContext();
|
||||||
|
final boolean hasRegulatoryInfo = context.getResources()
|
||||||
|
.getBoolean(R.bool.config_show_regulatory_info);
|
||||||
|
|
||||||
|
if (!hasRegulatoryInfo) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Launch intent
|
||||||
|
mInstrumentation.startActivitySync(mRegulatoryInfoIntent);
|
||||||
|
|
||||||
|
onView(withId(R.id.regulatoryInfo))
|
||||||
|
.inRoot(isDialog())
|
||||||
|
.check(matches(isDisplayed()));
|
||||||
|
} finally {
|
||||||
|
if (tempFileCreated) {
|
||||||
|
final String filename =
|
||||||
|
RegulatoryInfoDisplayActivity.getRegulatoryInfoImageFileName();
|
||||||
|
new File(filename).delete();
|
||||||
|
Log.d(TAG, "Deleting temp file " + filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ensures regulatory label image exists on disk.
|
||||||
|
*
|
||||||
|
* @return true if a test image is created.
|
||||||
|
*/
|
||||||
|
private boolean ensureRegulatoryInfoImageExists() throws IOException {
|
||||||
|
final String filename = RegulatoryInfoDisplayActivity.getRegulatoryInfoImageFileName();
|
||||||
|
if (new File(filename).exists()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Log.d(TAG, "Creating temp file " + filename);
|
||||||
|
final Bitmap bitmap = Bitmap.createBitmap(400 /* width */, 400 /* height */,
|
||||||
|
Bitmap.Config.ARGB_8888);
|
||||||
|
final FileOutputStream out = new FileOutputStream(filename);
|
||||||
|
bitmap.compress(Bitmap.CompressFormat.PNG, 100 /* quality */, out);
|
||||||
|
out.close();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user