summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Michael Jurka <mikejurka@google.com> 2012-11-01 18:26:01 -0700
committer Michael Jurka <mikejurka@google.com> 2012-11-01 18:50:21 -0700
commit67a871d85732e582c70a2a1d85ef4419eb658a12 (patch)
treeeffd9037568ce6a2fd73afa3150ce5646881f9a3
parent9767597a74bd9a5a265ff72aa5f77dd7efb93b53 (diff)
Use clock's widget as the default keyguard widget
Also, if we have no widgets in lockscreen, reinflate the default widget. If that fails, inflate the built-in clock (KeyguardStatusView) Change-Id: I2e90ab0893c993a755700e075e4a8ac5a685e0f2
-rw-r--r--core/java/com/android/internal/widget/LockPatternUtils.java6
-rwxr-xr-xcore/res/res/values/config.xml6
-rwxr-xr-xcore/res/res/values/strings.xml9
-rw-r--r--core/res/res/values/symbols.xml1
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java135
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetFrame.java5
-rw-r--r--services/java/com/android/server/AppWidgetServiceImpl.java4
7 files changed, 90 insertions, 76 deletions
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java
index 3ee3c8cb76ea..e5e1a2b6b930 100644
--- a/core/java/com/android/internal/widget/LockPatternUtils.java
+++ b/core/java/com/android/internal/widget/LockPatternUtils.java
@@ -1073,11 +1073,7 @@ public class LockPatternUtils {
}
return appWidgetIds;
}
- if (appWidgetIdString == null) {
- return new int[] { LockPatternUtils.ID_DEFAULT_STATUS_WIDGET };
- } else {
- return new int[0];
- }
+ return new int[0];
}
private static String combineStrings(int[] list, String separator) {
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 0890a182b871..4861c572d459 100755
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -404,6 +404,12 @@
-->
<integer name="config_longPressOnPowerBehavior">1</integer>
+ <!-- Package name for default keyguard appwidget [DO NOT TRANSLATE] -->
+ <string name="widget_default_package_name"></string>
+
+ <!-- Class name for default keyguard appwidget [DO NOT TRANSLATE] -->
+ <string name="widget_default_class_name"></string>
+
<!-- Indicate whether the SD card is accessible without removing the battery. -->
<bool name="config_batterySdCardAccessibility">false</bool>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 51d64293d534..4a4f1c402572 100755
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -2065,15 +2065,6 @@
<!-- This can be used in any application wanting to disable the text "Emergency number" -->
<string name="emergency_call_dialog_number_for_display">Emergency number</string>
- <!-- String to display if the clock status widget is selected (it is the default) [CHAR LIMIT=22] -->
- <string name="widget_default" msgid="8269383575996003796">Clock</string>
-
- <!-- Package name for default widget [DO NOT TRANSLATE] -->
- <string name="widget_default_package_name">com.android.deskclock</string>
-
- <!-- Class name for default widget [DO NOT TRANSLATE] -->
- <string name="widget_default_class_name">com.android.deskclock.DeskClock</string>
-
<!--
*** touch based lock / unlock ***
--> <skip />
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 05b3068dfa9f..d28f139765ff 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -479,7 +479,6 @@
<java-symbol type="string" name="emailTypeOther" />
<java-symbol type="string" name="emailTypeWork" />
<java-symbol type="string" name="emergency_call_dialog_number_for_display" />
- <java-symbol type="string" name="widget_default" />
<java-symbol type="string" name="widget_default_package_name" />
<java-symbol type="string" name="widget_default_class_name" />
<java-symbol type="string" name="emergency_calls_only" />
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java
index ca3d0a2d051c..18f8b0c34b29 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java
@@ -29,8 +29,6 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentSender;
-import android.content.pm.ActivityInfo;
-import android.content.pm.PackageManager;
import android.content.pm.UserInfo;
import android.content.res.Resources;
import android.graphics.Canvas;
@@ -50,7 +48,6 @@ import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
-import android.view.accessibility.AccessibilityNodeInfo;
import android.view.animation.AnimationUtils;
import android.widget.RemoteViews.OnClickHandler;
@@ -59,7 +56,6 @@ import com.android.internal.policy.impl.keyguard.KeyguardSecurityModel.SecurityM
import com.android.internal.widget.LockPatternUtils;
import java.io.File;
-import java.util.ArrayList;
import java.util.List;
public class KeyguardHostView extends KeyguardViewBase {
@@ -68,10 +64,10 @@ public class KeyguardHostView extends KeyguardViewBase {
// Use this to debug all of keyguard
public static boolean DEBUG = KeyguardViewMediator.DEBUG;
- // also referenced in SecuritySettings.java
static final int APPWIDGET_HOST_ID = 0x4B455947;
private AppWidgetHost mAppWidgetHost;
+ private AppWidgetManager mAppWidgetManager;
private KeyguardWidgetPager mAppWidgetContainer;
private KeyguardSecurityViewFlipper mSecurityViewContainer;
private KeyguardSelectorView mKeyguardSelectorView;
@@ -113,6 +109,7 @@ public class KeyguardHostView extends KeyguardViewBase {
mLockPatternUtils = new LockPatternUtils(context);
mAppWidgetHost = new AppWidgetHost(
context, APPWIDGET_HOST_ID, mOnClickHandler, Looper.myLooper());
+ mAppWidgetManager = AppWidgetManager.getInstance(mContext);
mSecurityModel = new KeyguardSecurityModel(context);
// The following enables the MENU key to work for testing automation
@@ -158,10 +155,6 @@ public class KeyguardHostView extends KeyguardViewBase {
mAppWidgetContainer.setCallbacks(mWidgetCallbacks);
mAppWidgetContainer.setMinScale(0.5f);
- addDefaultWidgets();
- addWidgetsFromSettings();
- mSwitchPageRunnable.run();
-
SlidingChallengeLayout slider =
(SlidingChallengeLayout) findViewById(R.id.sliding_layout);
if (slider != null) {
@@ -183,8 +176,11 @@ public class KeyguardHostView extends KeyguardViewBase {
setSystemUiVisibility(getSystemUiVisibility() | View.STATUS_BAR_DISABLE_BACK);
}
- showPrimarySecurityScreen(false);
+ addDefaultWidgets();
+ addWidgetsFromSettings();
+ mSwitchPageRunnable.run();
+ showPrimarySecurityScreen(false);
updateSecurityViews();
}
@@ -549,8 +545,6 @@ public class KeyguardHostView extends KeyguardViewBase {
};
};
- private KeyguardStatusViewManager mKeyguardStatusViewManager;
-
// Used to ignore callbacks from methods that are no longer current (e.g. face unlock).
// This avoids unwanted asynchronous events from messing with the state.
private KeyguardSecurityCallback mNullCallback = new KeyguardSecurityCallback() {
@@ -715,6 +709,7 @@ public class KeyguardHostView extends KeyguardViewBase {
// biometric unlock to start next time keyguard is shown.
KeyguardUpdateMonitor.getInstance(mContext).setAlternateUnlockEnabled(true);
saveStickyWidgetIndex();
+ checkAppWidgetConsistency();
showPrimarySecurityScreen(true);
getSecurityView(mCurrentSecuritySelection).onPause();
CameraWidgetFrame cameraPage = findCameraPage();
@@ -812,15 +807,16 @@ public class KeyguardHostView extends KeyguardViewBase {
}
}
- private void addWidget(int appId, int pageIndex) {
- AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(mContext);
- AppWidgetProviderInfo appWidgetInfo = appWidgetManager.getAppWidgetInfo(appId);
+ private boolean addWidget(int appId, int pageIndex) {
+ AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appId);
if (appWidgetInfo != null) {
AppWidgetHostView view = getAppWidgetHost().createView(mContext, appId, appWidgetInfo);
addWidget(view, pageIndex);
+ return true;
} else {
Log.w(TAG, "AppWidgetInfo for app widget id " + appId + " was null, deleting");
mLockPatternUtils.removeAppWidget(appId);
+ return false;
}
}
@@ -890,22 +886,7 @@ public class KeyguardHostView extends KeyguardViewBase {
@Override
public void run() {
- int defaultIconId = 0;
- Resources res = KeyguardHostView.this.getContext().getResources();
- ComponentName clock = new ComponentName(
- res.getString(R.string.widget_default_package_name),
- res.getString(R.string.widget_default_class_name));
- try {
- ActivityInfo activityInfo =
- mContext.getPackageManager().getActivityInfo(clock, 0);
- if (activityInfo != null) {
- defaultIconId = activityInfo.icon;
- }
- } catch (PackageManager.NameNotFoundException e) {
- defaultIconId = 0;
- }
- launchPickActivityIntent(R.string.widget_default, defaultIconId, clock,
- LockPatternUtils.EXTRA_DEFAULT_WIDGET);
+ launchPickActivityIntent();
}
});
mCallback.dismiss(false);
@@ -916,8 +897,7 @@ public class KeyguardHostView extends KeyguardViewBase {
initializeTransportControl();
}
- private void launchPickActivityIntent(int defaultLabelId, int defaultIconId,
- ComponentName defaultComponentName, String defaultTag) {
+ private void launchPickActivityIntent() {
// Create intent to pick widget
Intent pickIntent = new Intent(AppWidgetManager.ACTION_KEYGUARD_APPWIDGET_PICK);
@@ -928,22 +908,6 @@ public class KeyguardHostView extends KeyguardViewBase {
pickIntent.putExtra(AppWidgetManager.EXTRA_CATEGORY_FILTER,
AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD);
- // Add an custom entry for the default
- AppWidgetProviderInfo defaultInfo = new AppWidgetProviderInfo();
- ArrayList<AppWidgetProviderInfo> extraInfos = new ArrayList<AppWidgetProviderInfo>();
- defaultInfo.label = getResources().getString(defaultLabelId);
- defaultInfo.icon = defaultIconId;
- defaultInfo.provider = defaultComponentName;
- extraInfos.add(defaultInfo);
-
- ArrayList<Bundle> extraExtras = new ArrayList<Bundle>();
- Bundle b = new Bundle();
- b.putBoolean(defaultTag, true);
- extraExtras.add(b);
-
- // Launch the widget picker
- pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_INFO, extraInfos);
- pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_EXTRAS, extraExtras);
pickIntent.putExtra(Intent.EXTRA_INTENT, getBaseIntent());
pickIntent.addFlags(
Intent.FLAG_ACTIVITY_NEW_TASK
@@ -1024,6 +988,22 @@ public class KeyguardHostView extends KeyguardViewBase {
}
}
+ private int getAddPageIndex() {
+ View addWidget = mAppWidgetContainer.findViewById(R.id.keyguard_add_widget);
+ int addPageIndex = mAppWidgetContainer.indexOfChild(addWidget);
+ // This shouldn't happen, but just to be safe!
+ if (addPageIndex < 0) {
+ addPageIndex = 0;
+ }
+ return addPageIndex;
+ }
+
+ private void addDefaultStatusWidget(int index) {
+ LayoutInflater inflater = LayoutInflater.from(mContext);
+ View statusWidget = inflater.inflate(R.layout.keyguard_status_view, null, true);
+ mAppWidgetContainer.addWidget(statusWidget, index);
+ }
+
private void addWidgetsFromSettings() {
DevicePolicyManager dpm =
(DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
@@ -1036,23 +1016,17 @@ public class KeyguardHostView extends KeyguardViewBase {
}
}
- View addWidget = mAppWidgetContainer.findViewById(R.id.keyguard_add_widget);
- int addPageIndex = mAppWidgetContainer.indexOfChild(addWidget);
- // This shouldn't happen, but just to be safe!
- if (addPageIndex < 0) {
- addPageIndex = 0;
- }
+ int addPageIndex = getAddPageIndex();
// Add user-selected widget
final int[] widgets = mLockPatternUtils.getAppWidgets();
+
if (widgets == null) {
Log.d(TAG, "Problem reading widgets");
} else {
for (int i = widgets.length -1; i >= 0; i--) {
if (widgets[i] == LockPatternUtils.ID_DEFAULT_STATUS_WIDGET) {
- LayoutInflater inflater = LayoutInflater.from(mContext);
- View statusWidget = inflater.inflate(R.layout.keyguard_status_view, null, true);
- mAppWidgetContainer.addWidget(statusWidget, addPageIndex + 1);
+ addDefaultStatusWidget(addPageIndex + 1);
} else {
// We add the widgets from left to right, starting after the first page after
// the add page. We count down, since the order will be persisted from right
@@ -1061,6 +1035,42 @@ public class KeyguardHostView extends KeyguardViewBase {
}
}
}
+ checkAppWidgetConsistency();
+ }
+
+ public void checkAppWidgetConsistency() {
+ final int childCount = mAppWidgetContainer.getChildCount();
+ boolean widgetPageExists = false;
+ for (int i = 0; i < childCount; i++) {
+ if (isWidgetPage(i)) {
+ widgetPageExists = true;
+ break;
+ }
+ }
+ if (!widgetPageExists) {
+ final int addPageIndex = getAddPageIndex();
+
+ Resources res = getContext().getResources();
+ ComponentName defaultAppWidget = new ComponentName(
+ res.getString(R.string.widget_default_package_name),
+ res.getString(R.string.widget_default_class_name));
+
+ // Note: we don't support configuring the widget
+ int appWidgetId = mAppWidgetHost.allocateAppWidgetId();
+ boolean bindSuccessful = false;
+ try {
+ mAppWidgetManager.bindAppWidgetId(appWidgetId, defaultAppWidget);
+ bindSuccessful = true;
+ } catch (IllegalArgumentException e) {
+ Log.e(TAG, "Error when trying to bind default AppWidget: " + e);
+ }
+ // Use the built-in status/clock view if we can't inflate the default widget
+ if (!(bindSuccessful && addWidget(appWidgetId, addPageIndex + 1))) {
+ addDefaultStatusWidget(addPageIndex + 1);
+ }
+ mAppWidgetContainer.onAddView(
+ mAppWidgetContainer.getChildAt(addPageIndex + 1), addPageIndex + 1);
+ }
}
Runnable mSwitchPageRunnable = new Runnable() {
@@ -1155,6 +1165,15 @@ public class KeyguardHostView extends KeyguardViewBase {
return null;
}
+ private boolean isWidgetPage(int pageIndex) {
+ View v = mAppWidgetContainer.getChildAt(pageIndex);
+ if (v != null && v instanceof KeyguardWidgetFrame) {
+ KeyguardWidgetFrame kwf = (KeyguardWidgetFrame) v;
+ return kwf.getContentAppWidgetId() != AppWidgetManager.INVALID_APPWIDGET_ID;
+ }
+ return false;
+ }
+
private boolean isCameraPage(int pageIndex) {
View v = mAppWidgetContainer.getChildAt(pageIndex);
return v != null && v instanceof CameraWidgetFrame;
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetFrame.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetFrame.java
index b1ff049a1961..bb4272c6f043 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetFrame.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetFrame.java
@@ -20,6 +20,7 @@ import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.appwidget.AppWidgetHostView;
+import android.appwidget.AppWidgetManager;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
@@ -220,8 +221,10 @@ public class KeyguardWidgetFrame extends FrameLayout {
View content = getContent();
if (content instanceof AppWidgetHostView) {
return ((AppWidgetHostView) content).getAppWidgetId();
- } else {
+ } else if (content instanceof KeyguardStatusView) {
return ((KeyguardStatusView) content).getAppWidgetId();
+ } else {
+ return AppWidgetManager.INVALID_APPWIDGET_ID;
}
}
diff --git a/services/java/com/android/server/AppWidgetServiceImpl.java b/services/java/com/android/server/AppWidgetServiceImpl.java
index d0dd9cf78e97..daa82f2928d4 100644
--- a/services/java/com/android/server/AppWidgetServiceImpl.java
+++ b/services/java/com/android/server/AppWidgetServiceImpl.java
@@ -599,7 +599,7 @@ class AppWidgetServiceImpl {
}
public void bindAppWidgetId(int appWidgetId, ComponentName provider, Bundle options) {
- mContext.enforceCallingPermission(android.Manifest.permission.BIND_APPWIDGET,
+ mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BIND_APPWIDGET,
"bindAppWidgetId appWidgetId=" + appWidgetId + " provider=" + provider);
bindAppWidgetIdImpl(appWidgetId, provider, options);
}
@@ -607,7 +607,7 @@ class AppWidgetServiceImpl {
public boolean bindAppWidgetIdIfAllowed(
String packageName, int appWidgetId, ComponentName provider, Bundle options) {
try {
- mContext.enforceCallingPermission(android.Manifest.permission.BIND_APPWIDGET, null);
+ mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BIND_APPWIDGET, null);
} catch (SecurityException se) {
if (!callerHasBindAppWidgetPermission(packageName)) {
return false;