forked from upstream-mirrors/OpenTracks
Add lock screen widget.
Fix issue with 4x1 widget not displaying properly.
This commit is contained in:
@@ -16,10 +16,12 @@ limitations under the License.
|
|||||||
-->
|
-->
|
||||||
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
|
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:configure="com.google.android.apps.mytracks.widgets.TrackWidgetConfigActivity"
|
android:configure="com.google.android.apps.mytracks.widgets.TrackWidgetConfigActivity"
|
||||||
|
android:initialKeyguardLayout="@layout/track_widget_4x1"
|
||||||
android:initialLayout="@layout/track_widget_4x2"
|
android:initialLayout="@layout/track_widget_4x2"
|
||||||
android:minHeight="110dp"
|
android:minHeight="110dp"
|
||||||
android:minResizeHeight="40dp"
|
android:minResizeHeight="40dp"
|
||||||
android:minResizeWidth="250dp"
|
android:minResizeWidth="250dp"
|
||||||
android:minWidth="250dp"
|
android:minWidth="250dp"
|
||||||
android:resizeMode="vertical"
|
android:resizeMode="vertical"
|
||||||
android:updatePeriodMillis="0" />
|
android:updatePeriodMillis="0"
|
||||||
|
android:widgetCategory="keyguard|home_screen" />
|
||||||
|
|||||||
@@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2013 Google Inc.
|
||||||
|
*
|
||||||
|
* 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.google.android.apps.mytracks.util;
|
||||||
|
|
||||||
|
import com.google.android.apps.mytracks.widgets.TrackWidgetProvider;
|
||||||
|
|
||||||
|
import android.annotation.TargetApi;
|
||||||
|
import android.appwidget.AppWidgetManager;
|
||||||
|
import android.appwidget.AppWidgetProviderInfo;
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* API level 16 specific implementation of the {@link ApiAdapter}.
|
||||||
|
*
|
||||||
|
* @author Jimmy Shih
|
||||||
|
*/
|
||||||
|
@TargetApi(16)
|
||||||
|
public class Api16Adapter extends Api14Adapter {
|
||||||
|
|
||||||
|
private static final String APP_WIDGET_SIZE_KEY = "app_widget_size_key";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getAppWidgetSize(AppWidgetManager appWidgetManager, int appWidgetId) {
|
||||||
|
Bundle bundle = appWidgetManager.getAppWidgetOptions(appWidgetId);
|
||||||
|
boolean isKeyguard = bundle.getInt(AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY, -1)
|
||||||
|
== AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD;
|
||||||
|
return bundle.getInt(APP_WIDGET_SIZE_KEY, isKeyguard ? TrackWidgetProvider.KEYGUARD_DEFAULT_SIZE
|
||||||
|
: TrackWidgetProvider.HOME_SCREEN_DEFAULT_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setAppWidgetSize(AppWidgetManager appWidgetManager, int appWidgetId, int size) {
|
||||||
|
Bundle bundle = new Bundle();
|
||||||
|
bundle.putInt(APP_WIDGET_SIZE_KEY, size);
|
||||||
|
appWidgetManager.updateAppWidgetOptions(appWidgetId, bundle);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -18,10 +18,12 @@ package com.google.android.apps.mytracks.util;
|
|||||||
import com.google.android.apps.mytracks.Constants;
|
import com.google.android.apps.mytracks.Constants;
|
||||||
import com.google.android.apps.mytracks.ContextualActionModeCallback;
|
import com.google.android.apps.mytracks.ContextualActionModeCallback;
|
||||||
import com.google.android.apps.mytracks.services.sensors.BluetoothConnectionManager;
|
import com.google.android.apps.mytracks.services.sensors.BluetoothConnectionManager;
|
||||||
|
import com.google.android.apps.mytracks.widgets.TrackWidgetProvider;
|
||||||
import com.google.api.client.http.HttpTransport;
|
import com.google.api.client.http.HttpTransport;
|
||||||
import com.google.api.client.http.apache.ApacheHttpTransport;
|
import com.google.api.client.http.apache.ApacheHttpTransport;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
|
import android.appwidget.AppWidgetManager;
|
||||||
import android.bluetooth.BluetoothDevice;
|
import android.bluetooth.BluetoothDevice;
|
||||||
import android.bluetooth.BluetoothSocket;
|
import android.bluetooth.BluetoothSocket;
|
||||||
import android.content.SharedPreferences.Editor;
|
import android.content.SharedPreferences.Editor;
|
||||||
@@ -136,4 +138,14 @@ public class Api8Adapter implements ApiAdapter {
|
|||||||
// Return false and allow the framework to handle the search key.
|
// Return false and allow the framework to handle the search key.
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getAppWidgetSize(AppWidgetManager appWidgetManager, int appWidgetId) {
|
||||||
|
return TrackWidgetProvider.HOME_SCREEN_DEFAULT_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setAppWidgetSize(AppWidgetManager appWidgetManager, int appWidgetId, int size) {
|
||||||
|
// Do nothing
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import com.google.android.apps.mytracks.ContextualActionModeCallback;
|
|||||||
import com.google.api.client.http.HttpTransport;
|
import com.google.api.client.http.HttpTransport;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
|
import android.appwidget.AppWidgetManager;
|
||||||
import android.bluetooth.BluetoothDevice;
|
import android.bluetooth.BluetoothDevice;
|
||||||
import android.bluetooth.BluetoothSocket;
|
import android.bluetooth.BluetoothSocket;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
@@ -169,5 +170,24 @@ public interface ApiAdapter {
|
|||||||
*
|
*
|
||||||
* @param menu the search menu
|
* @param menu the search menu
|
||||||
*/
|
*/
|
||||||
public boolean handleSearchKey(MenuItem menu);
|
public boolean handleSearchKey(MenuItem menu);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the app widget size.
|
||||||
|
* <p>
|
||||||
|
* Due to changes in API level 16.
|
||||||
|
*
|
||||||
|
* @param appWidgetManager the app widget manager
|
||||||
|
* @param appWidgetId the app widget id
|
||||||
|
*/
|
||||||
|
public int getAppWidgetSize(AppWidgetManager appWidgetManager, int appWidgetId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the app widget size.
|
||||||
|
*
|
||||||
|
* @param appWidgetManager the app widget manager.
|
||||||
|
* @param appWidgetId the app widgit id
|
||||||
|
* @param size the size
|
||||||
|
*/
|
||||||
|
public void setAppWidgetSize(AppWidgetManager appWidgetManager, int appWidgetId, int size);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,21 +31,18 @@ public class ApiAdapterFactory {
|
|||||||
*/
|
*/
|
||||||
public static ApiAdapter getApiAdapter() {
|
public static ApiAdapter getApiAdapter() {
|
||||||
if (apiAdapter == null) {
|
if (apiAdapter == null) {
|
||||||
if (Build.VERSION.SDK_INT >= 14) {
|
if (Build.VERSION.SDK_INT >= 16) {
|
||||||
|
apiAdapter = new Api16Adapter();
|
||||||
|
} else if (Build.VERSION.SDK_INT >= 14) {
|
||||||
apiAdapter = new Api14Adapter();
|
apiAdapter = new Api14Adapter();
|
||||||
return apiAdapter;
|
|
||||||
} else if (Build.VERSION.SDK_INT >= 11) {
|
} else if (Build.VERSION.SDK_INT >= 11) {
|
||||||
apiAdapter = new Api11Adapter();
|
apiAdapter = new Api11Adapter();
|
||||||
return apiAdapter;
|
|
||||||
} else if (Build.VERSION.SDK_INT >= 10) {
|
} else if (Build.VERSION.SDK_INT >= 10) {
|
||||||
apiAdapter = new Api10Adapter();
|
apiAdapter = new Api10Adapter();
|
||||||
return apiAdapter;
|
|
||||||
} else if (Build.VERSION.SDK_INT >= 9) {
|
} else if (Build.VERSION.SDK_INT >= 9) {
|
||||||
apiAdapter = new Api9Adapter();
|
apiAdapter = new Api9Adapter();
|
||||||
return apiAdapter;
|
|
||||||
} else {
|
} else {
|
||||||
apiAdapter = new Api8Adapter();
|
apiAdapter = new Api8Adapter();
|
||||||
return apiAdapter;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return apiAdapter;
|
return apiAdapter;
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import com.google.android.apps.mytracks.content.MyTracksProviderUtils;
|
|||||||
import com.google.android.apps.mytracks.content.Track;
|
import com.google.android.apps.mytracks.content.Track;
|
||||||
import com.google.android.apps.mytracks.services.ControlRecordingService;
|
import com.google.android.apps.mytracks.services.ControlRecordingService;
|
||||||
import com.google.android.apps.mytracks.stats.TripStatistics;
|
import com.google.android.apps.mytracks.stats.TripStatistics;
|
||||||
|
import com.google.android.apps.mytracks.util.ApiAdapterFactory;
|
||||||
import com.google.android.apps.mytracks.util.IntentUtils;
|
import com.google.android.apps.mytracks.util.IntentUtils;
|
||||||
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
import com.google.android.apps.mytracks.util.StringUtils;
|
import com.google.android.apps.mytracks.util.StringUtils;
|
||||||
@@ -31,13 +32,13 @@ import android.annotation.TargetApi;
|
|||||||
import android.app.PendingIntent;
|
import android.app.PendingIntent;
|
||||||
import android.appwidget.AppWidgetManager;
|
import android.appwidget.AppWidgetManager;
|
||||||
import android.appwidget.AppWidgetProvider;
|
import android.appwidget.AppWidgetProvider;
|
||||||
|
import android.appwidget.AppWidgetProviderInfo;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.support.v4.app.TaskStackBuilder;
|
import android.support.v4.app.TaskStackBuilder;
|
||||||
import android.util.SparseIntArray;
|
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.RemoteViews;
|
import android.widget.RemoteViews;
|
||||||
|
|
||||||
@@ -51,14 +52,13 @@ import android.widget.RemoteViews;
|
|||||||
*/
|
*/
|
||||||
public class TrackWidgetProvider extends AppWidgetProvider {
|
public class TrackWidgetProvider extends AppWidgetProvider {
|
||||||
|
|
||||||
|
public static final int KEYGUARD_DEFAULT_SIZE = 1;
|
||||||
|
public static final int HOME_SCREEN_DEFAULT_SIZE = 2;
|
||||||
|
|
||||||
private static final int TWO_CELLS = 110;
|
private static final int TWO_CELLS = 110;
|
||||||
private static final int THREE_CELLS = 180;
|
private static final int THREE_CELLS = 180;
|
||||||
private static final int FOUR_CELLS = 250;
|
private static final int FOUR_CELLS = 250;
|
||||||
|
|
||||||
// Array of appwidget id to height size in cells
|
|
||||||
private static final SparseIntArray HEIGHT_SIZE = new SparseIntArray();
|
|
||||||
private static final int DEFAULT_SIZE = 2;
|
|
||||||
|
|
||||||
private static final int[] ITEM1_IDS = { R.id.track_widget_item1_label,
|
private static final int[] ITEM1_IDS = { R.id.track_widget_item1_label,
|
||||||
R.id.track_widget_item1_value, R.id.track_widget_item1_unit,
|
R.id.track_widget_item1_value, R.id.track_widget_item1_unit,
|
||||||
R.id.track_widget_item1_chronometer };
|
R.id.track_widget_item1_chronometer };
|
||||||
@@ -86,8 +86,9 @@ public class TrackWidgetProvider extends AppWidgetProvider {
|
|||||||
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(
|
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(
|
||||||
new ComponentName(context, TrackWidgetProvider.class));
|
new ComponentName(context, TrackWidgetProvider.class));
|
||||||
for (int appWidgetId : appWidgetIds) {
|
for (int appWidgetId : appWidgetIds) {
|
||||||
RemoteViews remoteViews = getRemoteViews(
|
int size = ApiAdapterFactory.getApiAdapter()
|
||||||
context, trackId, HEIGHT_SIZE.get(appWidgetId, DEFAULT_SIZE));
|
.getAppWidgetSize(appWidgetManager, appWidgetId);
|
||||||
|
RemoteViews remoteViews = getRemoteViews(context, trackId, size);
|
||||||
appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
|
appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -99,19 +100,24 @@ public class TrackWidgetProvider extends AppWidgetProvider {
|
|||||||
Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) {
|
Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) {
|
||||||
if (newOptions != null) {
|
if (newOptions != null) {
|
||||||
int size;
|
int size;
|
||||||
int height = newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT);
|
if (newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY, -1)
|
||||||
if (height == 0) {
|
== AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD) {
|
||||||
size = 2;
|
|
||||||
} else if (height >= FOUR_CELLS) {
|
|
||||||
size = 4;
|
|
||||||
} else if (height >= THREE_CELLS) {
|
|
||||||
size = 3;
|
|
||||||
} else if (height >= TWO_CELLS) {
|
|
||||||
size = 2;
|
|
||||||
} else {
|
|
||||||
size = 1;
|
size = 1;
|
||||||
|
} else {
|
||||||
|
int height = newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT);
|
||||||
|
if (height == 0) {
|
||||||
|
size = 2;
|
||||||
|
} else if (height >= FOUR_CELLS) {
|
||||||
|
size = 4;
|
||||||
|
} else if (height >= THREE_CELLS) {
|
||||||
|
size = 3;
|
||||||
|
} else if (height >= TWO_CELLS) {
|
||||||
|
size = 2;
|
||||||
|
} else {
|
||||||
|
size = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
HEIGHT_SIZE.put(appWidgetId, size);
|
ApiAdapterFactory.getApiAdapter().setAppWidgetSize(appWidgetManager, appWidgetId, size);
|
||||||
RemoteViews remoteViews = getRemoteViews(context, -1L, size);
|
RemoteViews remoteViews = getRemoteViews(context, -1L, size);
|
||||||
appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
|
appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
|
||||||
}
|
}
|
||||||
@@ -126,8 +132,9 @@ public class TrackWidgetProvider extends AppWidgetProvider {
|
|||||||
*/
|
*/
|
||||||
public static void updateAppWidget(
|
public static void updateAppWidget(
|
||||||
Context context, AppWidgetManager appWidgetManager, int appWidgetId) {
|
Context context, AppWidgetManager appWidgetManager, int appWidgetId) {
|
||||||
RemoteViews remoteViews = getRemoteViews(
|
int size = ApiAdapterFactory.getApiAdapter().getAppWidgetSize(appWidgetManager, appWidgetId);
|
||||||
context, -1L, HEIGHT_SIZE.get(appWidgetId, DEFAULT_SIZE));
|
ApiAdapterFactory.getApiAdapter().setAppWidgetSize(appWidgetManager, appWidgetId, size);
|
||||||
|
RemoteViews remoteViews = getRemoteViews(context, -1L, size);
|
||||||
appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
|
appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user