Snap for 7717622 from 88cd5025e1 to sc-v2-release

Change-Id: Ibdb6e760fad37410c3d7cbc2ea4ce534ffa98a1b
This commit is contained in:
Android Build Coastguard Worker
2021-09-09 23:13:06 +00:00
15 changed files with 230 additions and 111 deletions

View File

@@ -107,6 +107,8 @@
<uses-permission android:name="android.permission.READ_DREAM_STATE" /> <uses-permission android:name="android.permission.READ_DREAM_STATE" />
<uses-permission android:name="android.permission.READ_DREAM_SUPPRESSION" /> <uses-permission android:name="android.permission.READ_DREAM_SUPPRESSION" />
<uses-permission android:name="android.permission.MANAGE_APP_HIBERNATION" /> <uses-permission android:name="android.permission.MANAGE_APP_HIBERNATION" />
<uses-permission android:name="android.permission.LAUNCH_TWO_PANE_SETTINGS_DEEP_LINK" />
<uses-permission android:name="android.permission.ALLOW_PLACE_IN_TWO_PANE_SETTINGS" />
<application <application
android:name=".SettingsApplication" android:name=".SettingsApplication"
@@ -172,6 +174,17 @@
<meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts"/> <meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts"/>
</activity-alias> </activity-alias>
<!-- Alias for SettingsHomepageActivity which works for deep link page in 2-panel. -->
<activity-alias android:name="DeepLinkHomepageActivity"
android:label="@string/settings_label_launcher"
android:exported="true"
android:targetActivity=".homepage.SettingsHomepageActivity">
<intent-filter>
<action android:name="android.settings.SETTINGS_LARGE_SCREEN_DEEP_LINK" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity-alias>
<receiver android:name=".SettingsInitialize" <receiver android:name=".SettingsInitialize"
android:exported="true"> android:exported="true">
<intent-filter> <intent-filter>

View File

@@ -19,6 +19,6 @@
android:viewportWidth="24.0" android:viewportWidth="24.0"
android:viewportHeight="24.0"> android:viewportHeight="24.0">
<path <path
android:pathData="M9.321,2V7.359L4.68,4.68L2,9.321L6.641,12L2,14.679L4.68,19.32L9.321,16.641V22H14.68V16.641L19.321,19.32L22,14.679L17.359,12L22,9.321L19.321,4.68L14.68,7.359V2H9.321Z" android:pathData="M20.79,9.23l-2,-3.46l-4.79,2.77l0,-5.54l-4,0l0,5.54l-4.79,-2.77l-2,3.46l4.79,2.77l-4.79,2.77l2,3.46l4.79,-2.77l0,5.54l4,0l0,-5.54l4.79,2.77l2,-3.46l-4.79,-2.77z"
android:fillColor="?android:attr/colorPrimary"/> android:fillColor="?android:attr/colorPrimary"/>
</vector> </vector>

View File

@@ -6198,6 +6198,12 @@
<string name="battery_tip_limited_temporarily_title">Charging temporarily limited</string> <string name="battery_tip_limited_temporarily_title">Charging temporarily limited</string>
<!-- Summary for the battery limited temporarily tip [CHAR LIMIT=NONE] --> <!-- Summary for the battery limited temporarily tip [CHAR LIMIT=NONE] -->
<string name="battery_tip_limited_temporarily_summary">To preserve your battery. Learn more.</string> <string name="battery_tip_limited_temporarily_summary">To preserve your battery. Learn more.</string>
<!-- Text of battery limited temporarily tip resume charge button. [CHAR LIMIT=NONE] -->
<string name="battery_tip_limited_temporarily_dialog_resume_charge">Resume charging</string>
<!-- Message of battery limited temporarily tip. [CHAR LIMIT=NONE] -->
<string name="battery_tip_limited_temporarily_dialog_msg" product="default">In certain conditions, like high temperatures and long charging periods, charging may be limited to <xliff:g id="percent" example="50%">%1$s</xliff:g> to help preserve battery health.\n\nWhen those conditions end, your phone will automatically charge normally.</string>
<!-- Message of battery limited temporarily tip. [CHAR LIMIT=NONE] -->
<string name="battery_tip_limited_temporarily_dialog_msg" product="tablet">In certain conditions, like high temperatures and long charging periods, charging may be limited to <xliff:g id="percent" example="50%">%1$s</xliff:g> to help preserve battery health.\n\nWhen those conditions end, your tablet will automatically charge normally.</string>
<!-- Message for battery tip dialog to show the status about the battery [CHAR LIMIT=NONE] --> <!-- Message for battery tip dialog to show the status about the battery [CHAR LIMIT=NONE] -->
<string name="battery_tip_dialog_message" product="default">Because youve used your phone more than usual, your battery may run out sooner than it normally would.\n\nApps using most battery:</string> <string name="battery_tip_dialog_message" product="default">Because youve used your phone more than usual, your battery may run out sooner than it normally would.\n\nApps using most battery:</string>
<!-- Message for battery tip dialog to show the status about the battery [CHAR LIMIT=NONE] --> <!-- Message for battery tip dialog to show the status about the battery [CHAR LIMIT=NONE] -->

View File

@@ -58,6 +58,8 @@ import com.android.settings.core.SettingsBaseActivity;
import com.android.settings.core.SubSettingLauncher; import com.android.settings.core.SubSettingLauncher;
import com.android.settings.core.gateway.SettingsGateway; import com.android.settings.core.gateway.SettingsGateway;
import com.android.settings.dashboard.DashboardFeatureProvider; import com.android.settings.dashboard.DashboardFeatureProvider;
import com.android.settings.activityembedding.ActivityEmbeddingUtils;
import com.android.settings.homepage.SettingsHomepageActivity;
import com.android.settings.homepage.TopLevelSettings; import com.android.settings.homepage.TopLevelSettings;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settings.wfd.WifiDisplaySettings; import com.android.settings.wfd.WifiDisplaySettings;
@@ -240,7 +242,22 @@ public class SettingsActivity extends SettingsBaseActivity
// Should happen before any call to getIntent() // Should happen before any call to getIntent()
getMetaData(); getMetaData();
// If it's a deep link intent, start the Activity from SettingsHomepageActivity for 2-pane.
final Intent intent = getIntent(); final Intent intent = getIntent();
final boolean isFromSettingsHomepage = intent.getBooleanExtra(
SettingsHomepageActivity.EXTRA_IS_FROM_SETTINGS_HOMEPAGE, /* defaultValue */ false);
if (ActivityEmbeddingUtils.isEmbeddingActivityEnabled(this) && !isFromSettingsHomepage
&& isOnlyOneActivityInActivityStack()) {
final Intent trampolineIntent =
new Intent(android.provider.Settings.ACTION_SETTINGS_LARGE_SCREEN_DEEP_LINK);
trampolineIntent.putExtra(
android.provider.Settings.EXTRA_SETTINGS_LARGE_SCREEN_DEEP_LINK_INTENT_URI,
intent.toUri(Intent.URI_INTENT_SCHEME));
startActivity(trampolineIntent);
finish();
return;
}
if (intent.hasExtra(EXTRA_UI_OPTIONS)) { if (intent.hasExtra(EXTRA_UI_OPTIONS)) {
getWindow().setUiOptions(intent.getIntExtra(EXTRA_UI_OPTIONS, 0)); getWindow().setUiOptions(intent.getIntExtra(EXTRA_UI_OPTIONS, 0));
} }
@@ -347,6 +364,12 @@ public class SettingsActivity extends SettingsBaseActivity
} }
} }
private boolean isOnlyOneActivityInActivityStack() {
final ActivityManager activityManager = getSystemService(ActivityManager.class);
List<ActivityManager.RunningTaskInfo> taskList = activityManager.getRunningTasks(2);
return taskList.get(0).numActivities == 1;
}
/** Returns the initial fragment name that the activity will launch. */ /** Returns the initial fragment name that the activity will launch. */
@VisibleForTesting @VisibleForTesting
public String getInitialFragmentName(Intent intent) { public String getInitialFragmentName(Intent intent) {

View File

@@ -32,6 +32,8 @@ import androidx.window.embedding.SplitPlaceholderRule;
import com.android.settings.Settings; import com.android.settings.Settings;
import com.android.settings.SubSettings; import com.android.settings.SubSettings;
import com.android.settings.Utils;
import com.android.settings.homepage.SettingsHomepageActivity;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
@@ -60,14 +62,39 @@ public class ActivityEmbeddingRulesController {
mSplitController.clearRegisteredRules(); mSplitController.clearRegisteredRules();
// Set a placeholder for home page. // Set a placeholder for home page.
mSplitController.registerRule(getHomepagePlaceholderRule()); registerHomepagePlaceholderRule();
// Set subsettings rule. // Set subsettings rule.
mSplitController.registerRule(getSubSettingsPairRule()); registerTwoPanePairRule(mContext,
getComponentName(Settings.class),
getComponentName(SubSettings.class),
true /* finishPrimaryWithSecondary */,
true /* finishSecondaryWithPrimary */);
} }
private SplitPlaceholderRule getHomepagePlaceholderRule() { /** Register a SplitPairRule for 2-pane. */
public static void registerTwoPanePairRule(Context context,
ComponentName primary, ComponentName secondary,
boolean finishPrimaryWithSecondary, boolean finishSecondaryWithPrimary) {
final Set<SplitPairFilter> filters = new HashSet<>();
filters.add(new SplitPairFilter(primary, secondary,
null /* secondaryActivityIntentAction */,
null /* secondaryActivityIntentCategory */));
new SplitController(context).registerRule(new SplitPairRule(filters,
finishPrimaryWithSecondary,
finishSecondaryWithPrimary, true /* clearTop */,
ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthPx(context),
ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthPx(context),
ActivityEmbeddingUtils.SPLIT_RATIO,
LayoutDirection.LOCALE));
}
private void registerHomepagePlaceholderRule() {
final Set<ActivityFilter> activityFilters = new HashSet<>(); final Set<ActivityFilter> activityFilters = new HashSet<>();
activityFilters.add(new ActivityFilter(getComponentName(SettingsHomepageActivity.class)));
activityFilters.add(new ActivityFilter(getComponentName(Settings.class))); activityFilters.add(new ActivityFilter(getComponentName(Settings.class)));
activityFilters.add(new ActivityFilter(new ComponentName(Utils.SETTINGS_PACKAGE_NAME,
SettingsHomepageActivity.ALIAS_DEEP_LINK)));
final Intent intent = new Intent(); final Intent intent = new Intent();
intent.setComponent(getComponentName(Settings.NetworkDashboardActivity.class)); intent.setComponent(getComponentName(Settings.NetworkDashboardActivity.class));
final SplitPlaceholderRule placeholderRule = new SplitPlaceholderRule( final SplitPlaceholderRule placeholderRule = new SplitPlaceholderRule(
@@ -78,27 +105,7 @@ public class ActivityEmbeddingRulesController {
ActivityEmbeddingUtils.SPLIT_RATIO, ActivityEmbeddingUtils.SPLIT_RATIO,
LayoutDirection.LOCALE); LayoutDirection.LOCALE);
return placeholderRule; mSplitController.registerRule(placeholderRule);
}
private SplitPairRule getSubSettingsPairRule() {
final Set<SplitPairFilter> pairFilters = new HashSet<>();
pairFilters.add(new SplitPairFilter(
getComponentName(Settings.class),
getComponentName(SubSettings.class),
null /* secondaryActivityIntentAction */,
null /* secondaryActivityIntentCategory */));
final SplitPairRule rule = new SplitPairRule(
pairFilters,
true /* finishPrimaryWithSecondary */,
true /* finishSecondaryWithPrimary */,
true /* clearTop */,
ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthPx(mContext),
ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthPx(mContext),
ActivityEmbeddingUtils.SPLIT_RATIO,
LayoutDirection.LOCALE);
return rule;
} }
@NonNull @NonNull

View File

@@ -139,6 +139,11 @@ public interface PowerUsageFeatureProvider {
*/ */
boolean isChartGraphSlotsEnabled(Context context); boolean isChartGraphSlotsEnabled(Context context);
/**
* Gets a intent for one time bypass charge limited to resume charging.
*/
Intent getResumeChargeIntent();
/** /**
* Returns battery history data with corresponding timestamp key. * Returns battery history data with corresponding timestamp key.
*/ */

View File

@@ -166,6 +166,11 @@ public class PowerUsageFeatureProviderImpl implements PowerUsageFeatureProvider
return false; return false;
} }
@Override
public Intent getResumeChargeIntent() {
return null;
}
@Override @Override
public Map<Long, Map<String, BatteryHistEntry>> getBatteryHistory(Context context) { public Map<Long, Map<String, BatteryHistEntry>> getBatteryHistory(Context context) {
return null; return null;

View File

@@ -20,6 +20,9 @@ import android.app.Dialog;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@@ -40,6 +43,7 @@ import com.android.settings.fuelgauge.batterytip.tips.HighUsageTip;
import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip; import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip;
import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip; import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip;
import java.text.NumberFormat;
import java.util.List; import java.util.List;
/** /**
@@ -50,6 +54,7 @@ public class BatteryTipDialogFragment extends InstrumentedDialogFragment impleme
private static final String ARG_BATTERY_TIP = "battery_tip"; private static final String ARG_BATTERY_TIP = "battery_tip";
private static final String ARG_METRICS_KEY = "metrics_key"; private static final String ARG_METRICS_KEY = "metrics_key";
private static final double CHARGE_LIMIT_LEVEL = 0.8f;
@VisibleForTesting @VisibleForTesting
BatteryTip mBatteryTip; BatteryTip mBatteryTip;
@@ -138,6 +143,28 @@ public class BatteryTipDialogFragment extends InstrumentedDialogFragment impleme
.setPositiveButton(R.string.battery_tip_unrestrict_app_dialog_ok, this) .setPositiveButton(R.string.battery_tip_unrestrict_app_dialog_ok, this)
.setNegativeButton(R.string.battery_tip_unrestrict_app_dialog_cancel, null) .setNegativeButton(R.string.battery_tip_unrestrict_app_dialog_cancel, null)
.create(); .create();
case BatteryTip.TipType.BATTERY_DEFENDER:
mMetricsFeatureProvider.action(context,
SettingsEnums.ACTION_TIP_BATTERY_DEFENDER, mMetricsKey);
final String percentage =
NumberFormat.getPercentInstance().format(CHARGE_LIMIT_LEVEL);
final String message = context.getString(
R.string.battery_tip_limited_temporarily_dialog_msg, percentage);
final boolean isPluggedIn = isPluggedIn();
final AlertDialog.Builder dialogBuilder =
new AlertDialog.Builder(context)
.setTitle(R.string.battery_tip_limited_temporarily_title)
.setMessage(message);
if (isPluggedIn) {
dialogBuilder
.setPositiveButton(
R.string.battery_tip_limited_temporarily_dialog_resume_charge,
this)
.setNegativeButton(R.string.okay, null);
} else {
dialogBuilder.setPositiveButton(R.string.okay, null);
}
return dialogBuilder.create();
default: default:
throw new IllegalArgumentException("unknown type " + mBatteryTip.getType()); throw new IllegalArgumentException("unknown type " + mBatteryTip.getType());
} }
@@ -163,4 +190,11 @@ public class BatteryTipDialogFragment extends InstrumentedDialogFragment impleme
lsn.onBatteryTipHandled(mBatteryTip); lsn.onBatteryTipHandled(mBatteryTip);
} }
private boolean isPluggedIn() {
final Intent batteryIntent = getContext().registerReceiver(null /* receiver */,
new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
return batteryIntent != null && batteryIntent.getIntExtra(
BatteryManager.EXTRA_PLUGGED, 0) != 0;
}
} }

View File

@@ -16,12 +16,11 @@
package com.android.settings.fuelgauge.batterytip.actions; package com.android.settings.fuelgauge.batterytip.actions;
import android.app.settings.SettingsEnums;
import android.content.Intent; import android.content.Intent;
import com.android.settings.R;
import com.android.settings.SettingsActivity; import com.android.settings.SettingsActivity;
import com.android.settingslib.HelpUtils; import com.android.settings.overlay.FeatureFactory;
import android.os.AsyncTask;
/** /**
* Action to open the Support Center article * Action to open the Support Center article
@@ -34,19 +33,13 @@ public class BatteryDefenderAction extends BatteryTipAction {
mSettingsActivity = settingsActivity; mSettingsActivity = settingsActivity;
} }
/**
* Handle the action when user clicks positive button
*/
@Override @Override
public void handlePositiveAction(int metricsKey) { public void handlePositiveAction(int metricsKey) {
mMetricsFeatureProvider.action(mContext, final Intent intent = FeatureFactory.getFactory(mContext)
SettingsEnums.ACTION_TIP_BATTERY_DEFENDER, metricsKey); .getPowerUsageFeatureProvider(mContext).getResumeChargeIntent();
final Intent intent = HelpUtils.getHelpIntent(
mContext,
mContext.getString(R.string.help_url_battery_defender),
getClass().getName());
if (intent != null) { if (intent != null) {
mSettingsActivity.startActivityForResult(intent, 0); // Post intent to background thread to avoid UI flaky
AsyncTask.execute(() -> mContext.sendBroadcast(intent));
} }
} }
} }

View File

@@ -17,7 +17,6 @@
package com.android.settings.fuelgauge.batterytip.detectors; package com.android.settings.fuelgauge.batterytip.detectors;
import com.android.settings.fuelgauge.BatteryInfo; import com.android.settings.fuelgauge.BatteryInfo;
import com.android.settings.fuelgauge.BatteryUtils;
import com.android.settings.fuelgauge.batterytip.tips.BatteryDefenderTip; import com.android.settings.fuelgauge.batterytip.tips.BatteryDefenderTip;
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
@@ -34,7 +33,7 @@ public class BatteryDefenderDetector implements BatteryTipDetector {
@Override @Override
public BatteryTip detect() { public BatteryTip detect() {
final int state = final int state =
BatteryUtils.isBatteryDefenderOn(mBatteryInfo) mBatteryInfo.isOverheated
? BatteryTip.StateType.NEW ? BatteryTip.StateType.NEW
: BatteryTip.StateType.INVISIBLE; : BatteryTip.StateType.INVISIBLE;
return new BatteryDefenderTip(state); return new BatteryDefenderTip(state);

View File

@@ -29,7 +29,7 @@ import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
public class BatteryDefenderTip extends BatteryTip { public class BatteryDefenderTip extends BatteryTip {
public BatteryDefenderTip(@StateType int state) { public BatteryDefenderTip(@StateType int state) {
super(TipType.BATTERY_DEFENDER, state, false /* showDialog */); super(TipType.BATTERY_DEFENDER, state, true /* showDialog */);
} }
private BatteryDefenderTip(Parcel in) { private BatteryDefenderTip(Parcel in) {

View File

@@ -18,8 +18,14 @@ package com.android.settings.homepage;
import android.animation.LayoutTransition; import android.animation.LayoutTransition;
import android.app.ActivityManager; import android.app.ActivityManager;
import android.app.PendingIntent;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle; import android.os.Bundle;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.FeatureFlagUtils; import android.util.FeatureFlagUtils;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
@@ -31,21 +37,33 @@ import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction; import androidx.fragment.app.FragmentTransaction;
import androidx.window.embedding.SplitController;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.accounts.AvatarViewMixin; import com.android.settings.accounts.AvatarViewMixin;
import com.android.settings.core.CategoryMixin; import com.android.settings.core.CategoryMixin;
import com.android.settings.core.FeatureFlags; import com.android.settings.core.FeatureFlags;
import com.android.settings.activityembedding.ActivityEmbeddingRulesController;
import com.android.settings.activityembedding.ActivityEmbeddingUtils;
import com.android.settings.homepage.contextualcards.ContextualCardsFragment; import com.android.settings.homepage.contextualcards.ContextualCardsFragment;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin; import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin;
import java.net.URISyntaxException;
/** Settings homepage activity */ /** Settings homepage activity */
public class SettingsHomepageActivity extends FragmentActivity implements public class SettingsHomepageActivity extends FragmentActivity implements
CategoryMixin.CategoryHandler { CategoryMixin.CategoryHandler {
private static final String TAG = "SettingsHomepageActivity"; private static final String TAG = "SettingsHomepageActivity";
// Put true value to the intent when startActivity for a deep link intent from this Activity.
public static final String EXTRA_IS_FROM_SETTINGS_HOMEPAGE = "is_from_settings_homepage";
// An alias class name of SettingsHomepageActivity.
public static final String ALIAS_DEEP_LINK = "com.android.settings.DeepLinkHomepageActivity";
private static final long HOMEPAGE_LOADING_TIMEOUT_MS = 300; private static final long HOMEPAGE_LOADING_TIMEOUT_MS = 300;
private View mHomepageView; private View mHomepageView;
@@ -105,6 +123,20 @@ public class SettingsHomepageActivity extends FragmentActivity implements
showFragment(new TopLevelSettings(), R.id.main_content); showFragment(new TopLevelSettings(), R.id.main_content);
((FrameLayout) findViewById(R.id.main_content)) ((FrameLayout) findViewById(R.id.main_content))
.getLayoutTransition().enableTransitionType(LayoutTransition.CHANGING); .getLayoutTransition().enableTransitionType(LayoutTransition.CHANGING);
// Launch the intent from deep link for large screen devices.
launchDeepLinkIntentToRight();
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// When it's large screen 2-pane and Settings app is in background. Receiving a Intent
// in this Activity will not finish nor onCreate. setIntent here for this case.
setIntent(intent);
// Launch the intent from deep link for large screen devices.
launchDeepLinkIntentToRight();
} }
private void showSuggestionFragment() { private void showSuggestionFragment() {
@@ -141,6 +173,54 @@ public class SettingsHomepageActivity extends FragmentActivity implements
fragmentTransaction.commit(); fragmentTransaction.commit();
} }
private void launchDeepLinkIntentToRight() {
if (!ActivityEmbeddingUtils.isEmbeddingActivityEnabled(this)) {
return;
}
final Intent intent = getIntent();
if (intent == null || !TextUtils.equals(intent.getAction(),
Settings.ACTION_SETTINGS_LARGE_SCREEN_DEEP_LINK)) {
return;
}
final String intentUriString = intent.getStringExtra(
Settings.EXTRA_SETTINGS_LARGE_SCREEN_DEEP_LINK_INTENT_URI);
if (TextUtils.isEmpty(intentUriString)) {
Log.e(TAG, "No EXTRA_SETTINGS_LARGE_SCREEN_DEEP_LINK_INTENT_URI to deep link");
finish();
return;
}
final Intent targetIntent;
try {
targetIntent = Intent.parseUri(intentUriString, Intent.URI_INTENT_SCHEME);
} catch (URISyntaxException e) {
Log.e(TAG, "Failed to parse deep link intent: " + e);
finish();
return;
}
final ComponentName targetComponentName = targetIntent.resolveActivity(getPackageManager());
if (targetComponentName == null) {
Log.e(TAG, "No valid target for the deep link intent: " + targetIntent);
finish();
return;
}
targetIntent.setFlags(targetIntent.getFlags() & ~Intent.FLAG_ACTIVITY_NEW_TASK);
targetIntent.putExtra(EXTRA_IS_FROM_SETTINGS_HOMEPAGE, true);
// Set 2-pane pair rule for the external deep link page.
ActivityEmbeddingRulesController.registerTwoPanePairRule(this,
new ComponentName(Utils.SETTINGS_PACKAGE_NAME, ALIAS_DEEP_LINK),
targetComponentName,
true /* finishPrimaryWithSecondary */,
true /* finishSecondaryWithPrimary */);
startActivity(targetIntent);
}
private void initHomepageContainer() { private void initHomepageContainer() {
final View view = findViewById(R.id.homepage_container); final View view = findViewById(R.id.homepage_container);
// Prevent inner RecyclerView gets focus and invokes scrolling. // Prevent inner RecyclerView gets focus and invokes scrolling.

View File

@@ -155,4 +155,9 @@ public class PowerUsageFeatureProviderImplTest {
assertThat(mPowerFeatureProvider.isSmartBatterySupported()).isFalse(); assertThat(mPowerFeatureProvider.isSmartBatterySupported()).isFalse();
} }
@Test
public void testGetResumeChargeIntent_returnNull() {
assertThat(mPowerFeatureProvider.getResumeChargeIntent()).isNull();
}
} }

View File

@@ -31,6 +31,7 @@ import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentActivity;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.fuelgauge.batterytip.tips.BatteryDefenderTip;
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
import com.android.settings.fuelgauge.batterytip.tips.HighUsageTip; import com.android.settings.fuelgauge.batterytip.tips.HighUsageTip;
import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip; import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip;
@@ -74,6 +75,7 @@ public class BatteryTipDialogFragmentTest {
private RestrictAppTip mRestrictTwoAppsTip; private RestrictAppTip mRestrictTwoAppsTip;
private UnrestrictAppTip mUnrestrictAppTip; private UnrestrictAppTip mUnrestrictAppTip;
private SummaryTip mSummaryTip; private SummaryTip mSummaryTip;
private BatteryDefenderTip mDefenderTip;
private AppInfo mAppInfo; private AppInfo mAppInfo;
private ShadowPackageManager mPackageManager; private ShadowPackageManager mPackageManager;
@@ -116,6 +118,7 @@ public class BatteryTipDialogFragmentTest {
mUnrestrictAppTip = new UnrestrictAppTip(BatteryTip.StateType.NEW, mAppInfo); mUnrestrictAppTip = new UnrestrictAppTip(BatteryTip.StateType.NEW, mAppInfo);
mSummaryTip = spy(new SummaryTip(BatteryTip.StateType.NEW, mSummaryTip = spy(new SummaryTip(BatteryTip.StateType.NEW,
EstimateKt.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN)); EstimateKt.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN));
mDefenderTip = new BatteryDefenderTip(BatteryTip.StateType.NEW);
} }
@After @After
@@ -243,4 +246,20 @@ public class BatteryTipDialogFragmentTest {
+ "your phone will suggest actions you can take.\n\nYou can always turn" + "your phone will suggest actions you can take.\n\nYou can always turn"
+ " on Battery Saver if youre running low on battery."); + " on Battery Saver if youre running low on battery.");
} }
@Test
public void testOnCreateDialog_defenderTip_fireDialog() {
mDialogFragment = BatteryTipDialogFragment.newInstance(mDefenderTip, METRICS_KEY);
FragmentController.setupFragment(mDialogFragment, FragmentActivity.class,
0 /* containerViewId */, null /* bundle */);
final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
assertThat(shadowDialog.getTitle()).isEqualTo(
mContext.getString(R.string.battery_tip_limited_temporarily_title));
assertThat(shadowDialog.getMessage()).isEqualTo(
mContext.getString(R.string.battery_tip_limited_temporarily_dialog_msg, "80%"));
}
} }

View File

@@ -1,70 +0,0 @@
/*
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.fuelgauge.batterytip.actions;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import android.app.settings.SettingsEnums;
import android.content.Context;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
@RunWith(RobolectricTestRunner.class)
public final class BatteryDefenderActionTest {
private Context mContext;
private FakeFeatureFactory mFeatureFactory;
private BatteryDefenderAction mBatteryDefenderAction;
private MetricsFeatureProvider mMetricsFeatureProvider;
@Mock private SettingsActivity mSettingsActivity;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mFeatureFactory = FakeFeatureFactory.setupForTest();
mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider;
mContext = spy(RuntimeEnvironment.application);
doReturn(mContext).when(mSettingsActivity).getApplicationContext();
mBatteryDefenderAction = new BatteryDefenderAction(mSettingsActivity);
}
@Test
public void testHandlePositiveAction_logMetric() {
final int metricKey = 10;
mBatteryDefenderAction.handlePositiveAction(metricKey);
verify(mMetricsFeatureProvider).action(mContext,
SettingsEnums.ACTION_TIP_BATTERY_DEFENDER, metricKey);
}
}