mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2024-12-26 18:45:49 +01:00
Implement App Sorting
- grab icon to move apps - cache can be sorted but nothing will be send to watch - if sorting apps or watchfaces, order will be sent to watch - we try to keep track of what is installed and what not Firmware 2.x is currently not working properly
This commit is contained in:
parent
65ac4b364f
commit
79b439da28
@ -48,13 +48,21 @@ public abstract class AbstractAppManagerFragment extends Fragment {
|
|||||||
private static final Logger LOG = LoggerFactory.getLogger(AbstractAppManagerFragment.class);
|
private static final Logger LOG = LoggerFactory.getLogger(AbstractAppManagerFragment.class);
|
||||||
|
|
||||||
|
|
||||||
public void refreshList() {
|
protected void refreshList() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getSortFilename() {
|
protected String getSortFilename() {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void onChangedAppOrder() {
|
||||||
|
List<UUID> uuidList = new ArrayList<>();
|
||||||
|
for (GBDeviceApp gbDeviceApp : mGBDeviceAppAdapter.getItemList()) {
|
||||||
|
uuidList.add(gbDeviceApp.getUUID());
|
||||||
|
}
|
||||||
|
AppManagerActivity.rewriteAppOrderFile(getSortFilename(), uuidList);
|
||||||
|
}
|
||||||
|
|
||||||
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
|
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
|
||||||
@Override
|
@Override
|
||||||
public void onReceive(Context context, Intent intent) {
|
public void onReceive(Context context, Intent intent) {
|
||||||
@ -62,30 +70,33 @@ public abstract class AbstractAppManagerFragment extends Fragment {
|
|||||||
if (action.equals(GBApplication.ACTION_QUIT)) {
|
if (action.equals(GBApplication.ACTION_QUIT)) {
|
||||||
// finish();
|
// finish();
|
||||||
} else if (action.equals(ACTION_REFRESH_APPLIST)) {
|
} else if (action.equals(ACTION_REFRESH_APPLIST)) {
|
||||||
int appCount = intent.getIntExtra("app_count", 0);
|
if (intent.hasExtra("app_count")) {
|
||||||
for (Integer i = 0; i < appCount; i++) {
|
int appCount = intent.getIntExtra("app_count", 0);
|
||||||
String appName = intent.getStringExtra("app_name" + i.toString());
|
for (Integer i = 0; i < appCount; i++) {
|
||||||
String appCreator = intent.getStringExtra("app_creator" + i.toString());
|
String appName = intent.getStringExtra("app_name" + i.toString());
|
||||||
UUID uuid = UUID.fromString(intent.getStringExtra("app_uuid" + i.toString()));
|
String appCreator = intent.getStringExtra("app_creator" + i.toString());
|
||||||
GBDeviceApp.Type appType = GBDeviceApp.Type.values()[intent.getIntExtra("app_type" + i.toString(), 0)];
|
UUID uuid = UUID.fromString(intent.getStringExtra("app_uuid" + i.toString()));
|
||||||
|
GBDeviceApp.Type appType = GBDeviceApp.Type.values()[intent.getIntExtra("app_type" + i.toString(), 0)];
|
||||||
|
|
||||||
boolean found = false;
|
boolean found = false;
|
||||||
for (final ListIterator<GBDeviceApp> iter = appList.listIterator(); iter.hasNext(); ) {
|
for (final ListIterator<GBDeviceApp> iter = appList.listIterator(); iter.hasNext(); ) {
|
||||||
final GBDeviceApp app = iter.next();
|
final GBDeviceApp app = iter.next();
|
||||||
if (app.getUUID().equals(uuid)) {
|
if (app.getUUID().equals(uuid)) {
|
||||||
|
app.setOnDevice(true);
|
||||||
|
iter.set(app);
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found) {
|
||||||
|
GBDeviceApp app = new GBDeviceApp(uuid, appName, appCreator, "", appType);
|
||||||
app.setOnDevice(true);
|
app.setOnDevice(true);
|
||||||
iter.set(app);
|
appList.add(app);
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!found) {
|
} else {
|
||||||
GBDeviceApp app = new GBDeviceApp(uuid, appName, appCreator, "", appType);
|
refreshList();
|
||||||
app.setOnDevice(true);
|
|
||||||
appList.add(app);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mGBDeviceAppAdapter.notifyDataSetChanged();
|
mGBDeviceAppAdapter.notifyDataSetChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -116,7 +127,7 @@ public abstract class AbstractAppManagerFragment extends Fragment {
|
|||||||
return systemWatchfaces;
|
return systemWatchfaces;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected List<GBDeviceApp> getCachedApps() {
|
protected List<GBDeviceApp> getCachedApps(List<UUID> uuids) {
|
||||||
List<GBDeviceApp> cachedAppList = new ArrayList<>();
|
List<GBDeviceApp> cachedAppList = new ArrayList<>();
|
||||||
File cachePath;
|
File cachePath;
|
||||||
try {
|
try {
|
||||||
@ -126,7 +137,16 @@ public abstract class AbstractAppManagerFragment extends Fragment {
|
|||||||
return cachedAppList;
|
return cachedAppList;
|
||||||
}
|
}
|
||||||
|
|
||||||
File files[] = cachePath.listFiles();
|
File[] files;
|
||||||
|
if (uuids == null) {
|
||||||
|
files = cachePath.listFiles();
|
||||||
|
} else {
|
||||||
|
files = new File[uuids.size()];
|
||||||
|
int index = 0;
|
||||||
|
for (UUID uuid : uuids) {
|
||||||
|
files[index++] = new File(uuid.toString() + ".pbw");
|
||||||
|
}
|
||||||
|
}
|
||||||
if (files != null) {
|
if (files != null) {
|
||||||
for (File file : files) {
|
for (File file : files) {
|
||||||
if (file.getName().endsWith(".pbw")) {
|
if (file.getName().endsWith(".pbw")) {
|
||||||
@ -140,8 +160,27 @@ public abstract class AbstractAppManagerFragment extends Fragment {
|
|||||||
JSONObject json = new JSONObject(jsonstring);
|
JSONObject json = new JSONObject(jsonstring);
|
||||||
cachedAppList.add(new GBDeviceApp(json, configFile.exists()));
|
cachedAppList.add(new GBDeviceApp(json, configFile.exists()));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
LOG.warn("could not read json file for " + baseName, e.getMessage(), e);
|
LOG.info("could not read json file for " + baseName);
|
||||||
cachedAppList.add(new GBDeviceApp(UUID.fromString(baseName), baseName, "N/A", "", GBDeviceApp.Type.UNKNOWN));
|
//FIXME: this is really ugly, if we do not find system uuids in pbw cache add them manually
|
||||||
|
if (prefs.getBoolean("pebble_force_untested", false)) {
|
||||||
|
if (baseName.equals("4dab81a6-d2fc-458a-992c-7a1f3b96a970")) {
|
||||||
|
cachedAppList.add(new GBDeviceApp(UUID.fromString("4dab81a6-d2fc-458a-992c-7a1f3b96a970"), "Sports (System)", "Pebble Inc.", "", GBDeviceApp.Type.APP_SYSTEM));
|
||||||
|
} else if (baseName.equals("cf1e816a-9db0-4511-bbb8-f60c48ca8fac")) {
|
||||||
|
cachedAppList.add(new GBDeviceApp(UUID.fromString("cf1e816a-9db0-4511-bbb8-f60c48ca8fac"), "Golf (System)", "Pebble Inc.", "", GBDeviceApp.Type.APP_SYSTEM));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (baseName.equals("8f3c8686-31a1-4f5f-91f5-01600c9bdc59")) {
|
||||||
|
cachedAppList.add(new GBDeviceApp(UUID.fromString("8f3c8686-31a1-4f5f-91f5-01600c9bdc59"), "Tic Toc (System)", "Pebble Inc.", "", GBDeviceApp.Type.WATCHFACE_SYSTEM));
|
||||||
|
}
|
||||||
|
if (mGBDevice != null && !"aplite".equals(PebbleUtils.getPlatformName(mGBDevice.getHardwareVersion()))) {
|
||||||
|
if (baseName.equals(PebbleProtocol.UUID_PEBBLE_HEALTH.toString())) {
|
||||||
|
cachedAppList.add(new GBDeviceApp(PebbleProtocol.UUID_PEBBLE_HEALTH, "Health (System)", "Pebble Inc.", "", GBDeviceApp.Type.APP_SYSTEM));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (uuids == null) {
|
||||||
|
cachedAppList.add(new GBDeviceApp(UUID.fromString(baseName), baseName, "N/A", "", GBDeviceApp.Type.UNKNOWN));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -177,9 +216,35 @@ public abstract class AbstractAppManagerFragment extends Fragment {
|
|||||||
mGBDeviceAppAdapter = new GBDeviceAppAdapter(appList, R.layout.item_with_details, R.id.item_image, this.getContext(), this);
|
mGBDeviceAppAdapter = new GBDeviceAppAdapter(appList, R.layout.item_with_details, R.id.item_image, this.getContext(), this);
|
||||||
appListView.setAdapter(mGBDeviceAppAdapter, false);
|
appListView.setAdapter(mGBDeviceAppAdapter, false);
|
||||||
appListView.setCanDragHorizontally(false);
|
appListView.setCanDragHorizontally(false);
|
||||||
|
appListView.setDragListListener(new DragListView.DragListListener() {
|
||||||
|
@Override
|
||||||
|
public void onItemDragStarted(int position) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onItemDragging(int itemPosition, float x, float y) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onItemDragEnded(int fromPosition, int toPosition) {
|
||||||
|
onChangedAppOrder();
|
||||||
|
}
|
||||||
|
});
|
||||||
return rootView;
|
return rootView;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void sendOrderToDevice(String concatFilename) {
|
||||||
|
ArrayList<UUID> uuids = new ArrayList<UUID>();
|
||||||
|
for (GBDeviceApp gbDeviceApp : mGBDeviceAppAdapter.getItemList()) {
|
||||||
|
uuids.add(gbDeviceApp.getUUID());
|
||||||
|
}
|
||||||
|
if (concatFilename != null) {
|
||||||
|
ArrayList<UUID> concatUuids = AppManagerActivity.getUuidsFromFile(concatFilename);
|
||||||
|
uuids.addAll(concatUuids);
|
||||||
|
}
|
||||||
|
GBApplication.deviceService().onAppReorder(uuids.toArray(new UUID[uuids.size()]));
|
||||||
|
}
|
||||||
|
|
||||||
private void removeAppFromList(UUID uuid) {
|
private void removeAppFromList(UUID uuid) {
|
||||||
for (final ListIterator<GBDeviceApp> iter = appList.listIterator(); iter.hasNext(); ) {
|
for (final ListIterator<GBDeviceApp> iter = appList.listIterator(); iter.hasNext(); ) {
|
||||||
final GBDeviceApp app = iter.next();
|
final GBDeviceApp app = iter.next();
|
||||||
@ -247,9 +312,13 @@ public abstract class AbstractAppManagerFragment extends Fragment {
|
|||||||
LOG.info("deleted file: " + fileToDelete.toString());
|
LOG.info("deleted file: " + fileToDelete.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
removeAppFromList(selectedApp.getUUID());
|
AppManagerActivity.deleteFromAppOrderFile("pbwcacheorder.txt", selectedApp.getUUID()); // FIXME: only if successful
|
||||||
// fall through
|
// fall through
|
||||||
case R.id.appmanager_app_delete:
|
case R.id.appmanager_app_delete:
|
||||||
|
AppManagerActivity.deleteFromAppOrderFile(mGBDevice.getAddress() + ".watchapps", selectedApp.getUUID()); // FIXME: only if successful
|
||||||
|
AppManagerActivity.deleteFromAppOrderFile(mGBDevice.getAddress() + ".watchfaces", selectedApp.getUUID()); // FIXME: only if successful
|
||||||
|
Intent refreshIntent = new Intent(AbstractAppManagerFragment.ACTION_REFRESH_APPLIST);
|
||||||
|
LocalBroadcastManager.getInstance(getContext()).sendBroadcast(refreshIntent);
|
||||||
GBApplication.deviceService().onAppDelete(selectedApp.getUUID());
|
GBApplication.deviceService().onAppDelete(selectedApp.getUUID());
|
||||||
return true;
|
return true;
|
||||||
case R.id.appmanager_app_reinstall:
|
case R.id.appmanager_app_reinstall:
|
||||||
@ -274,7 +343,6 @@ public abstract class AbstractAppManagerFragment extends Fragment {
|
|||||||
startActivity(startIntent);
|
startActivity(startIntent);
|
||||||
return true;
|
return true;
|
||||||
case R.id.appmanager_app_move_to_top:
|
case R.id.appmanager_app_move_to_top:
|
||||||
GBApplication.deviceService().onAppReorder(new UUID[]{selectedApp.getUUID()});
|
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
return super.onContextItemSelected(item);
|
return super.onContextItemSelected(item);
|
||||||
|
@ -7,13 +7,29 @@ import android.support.v4.app.NavUtils;
|
|||||||
import android.support.v4.view.ViewPager;
|
import android.support.v4.view.ViewPager;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.BufferedWriter;
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.FileWriter;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.R;
|
import nodomain.freeyourgadget.gadgetbridge.R;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.activities.AbstractFragmentPagerAdapter;
|
import nodomain.freeyourgadget.gadgetbridge.activities.AbstractFragmentPagerAdapter;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.activities.AbstractGBFragmentActivity;
|
import nodomain.freeyourgadget.gadgetbridge.activities.AbstractGBFragmentActivity;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.util.FileUtils;
|
||||||
|
|
||||||
|
|
||||||
public class AppManagerActivity extends AbstractGBFragmentActivity {
|
public class AppManagerActivity extends AbstractGBFragmentActivity {
|
||||||
|
|
||||||
|
private static final Logger LOG = LoggerFactory.getLogger(AbstractAppManagerFragment.class);
|
||||||
|
|
||||||
private GBDevice mGBDevice = null;
|
private GBDevice mGBDevice = null;
|
||||||
|
|
||||||
public GBDevice getGBDevice() {
|
public GBDevice getGBDevice() {
|
||||||
@ -45,6 +61,12 @@ public class AppManagerActivity extends AbstractGBFragmentActivity {
|
|||||||
return new SectionsPagerAdapter(fragmentManager);
|
return new SectionsPagerAdapter(fragmentManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static synchronized void deleteFromAppOrderFile(String filename, UUID uuid) {
|
||||||
|
ArrayList<UUID> uuids = getUuidsFromFile(filename);
|
||||||
|
uuids.remove(uuid);
|
||||||
|
rewriteAppOrderFile(filename, uuids);
|
||||||
|
}
|
||||||
|
|
||||||
public class SectionsPagerAdapter extends AbstractFragmentPagerAdapter {
|
public class SectionsPagerAdapter extends AbstractFragmentPagerAdapter {
|
||||||
|
|
||||||
public SectionsPagerAdapter(FragmentManager fm) {
|
public SectionsPagerAdapter(FragmentManager fm) {
|
||||||
@ -95,4 +117,40 @@ public class AppManagerActivity extends AbstractGBFragmentActivity {
|
|||||||
return super.onOptionsItemSelected(item);
|
return super.onOptionsItemSelected(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static synchronized void rewriteAppOrderFile(String filename, List<UUID> uuids) {
|
||||||
|
try {
|
||||||
|
FileWriter fileWriter = new FileWriter(FileUtils.getExternalFilesDir() + "/" + filename);
|
||||||
|
BufferedWriter out = new BufferedWriter(fileWriter);
|
||||||
|
for (UUID uuid : uuids) {
|
||||||
|
out.write(uuid.toString());
|
||||||
|
out.newLine();
|
||||||
|
}
|
||||||
|
out.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
LOG.warn("can't write app order to file!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
synchronized public static void addToAppOrderFile(String filename, UUID uuid) {
|
||||||
|
ArrayList<UUID> uuids = getUuidsFromFile(filename);
|
||||||
|
uuids.remove(uuid); // if alread there
|
||||||
|
uuids.add(uuid);
|
||||||
|
rewriteAppOrderFile(filename, uuids);
|
||||||
|
}
|
||||||
|
|
||||||
|
static synchronized ArrayList<UUID> getUuidsFromFile(String filename) {
|
||||||
|
ArrayList<UUID> uuids = new ArrayList<>();
|
||||||
|
try {
|
||||||
|
FileReader fileReader = new FileReader(FileUtils.getExternalFilesDir() + "/" + filename);
|
||||||
|
BufferedReader in = new BufferedReader(fileReader);
|
||||||
|
String line;
|
||||||
|
while ((line = in.readLine()) != null) {
|
||||||
|
uuids.add(UUID.fromString(line));
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
LOG.warn("could not read sort file");
|
||||||
|
}
|
||||||
|
return uuids;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,12 @@ package nodomain.freeyourgadget.gadgetbridge.activities.appmanager;
|
|||||||
public class AppManagerFragmentCache extends AbstractAppManagerFragment {
|
public class AppManagerFragmentCache extends AbstractAppManagerFragment {
|
||||||
@Override
|
@Override
|
||||||
public void refreshList() {
|
public void refreshList() {
|
||||||
appList.addAll(getCachedApps());
|
appList.clear();
|
||||||
|
appList.addAll(getCachedApps(null));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getSortFilename() {
|
||||||
|
return "pbwcacheorder.txt";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,13 +1,33 @@
|
|||||||
package nodomain.freeyourgadget.gadgetbridge.activities.appmanager;
|
package nodomain.freeyourgadget.gadgetbridge.activities.appmanager;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.impl.GBDeviceApp;
|
||||||
|
|
||||||
public class AppManagerFragmentInstalledApps extends AbstractAppManagerFragment {
|
public class AppManagerFragmentInstalledApps extends AbstractAppManagerFragment {
|
||||||
@Override
|
@Override
|
||||||
public void refreshList() {
|
protected void refreshList() {
|
||||||
appList.addAll(getSystemApps());
|
appList.clear();
|
||||||
|
ArrayList uuids = AppManagerActivity.getUuidsFromFile(getSortFilename());
|
||||||
|
if (uuids.isEmpty()) {
|
||||||
|
appList.addAll(getSystemApps());
|
||||||
|
for (GBDeviceApp gbDeviceApp : appList) {
|
||||||
|
uuids.add(gbDeviceApp.getUUID());
|
||||||
|
}
|
||||||
|
AppManagerActivity.rewriteAppOrderFile(getSortFilename(), uuids);
|
||||||
|
} else {
|
||||||
|
appList.addAll(getCachedApps(uuids));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@Override
|
|
||||||
|
|
||||||
public String getSortFilename() {
|
@Override
|
||||||
|
protected String getSortFilename() {
|
||||||
return mGBDevice.getAddress() + ".watchapps";
|
return mGBDevice.getAddress() + ".watchapps";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onChangedAppOrder() {
|
||||||
|
super.onChangedAppOrder();
|
||||||
|
sendOrderToDevice(mGBDevice.getAddress() + ".watchfaces");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,33 @@
|
|||||||
package nodomain.freeyourgadget.gadgetbridge.activities.appmanager;
|
package nodomain.freeyourgadget.gadgetbridge.activities.appmanager;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.impl.GBDeviceApp;
|
||||||
|
|
||||||
public class AppManagerFragmentInstalledWatchfaces extends AbstractAppManagerFragment {
|
public class AppManagerFragmentInstalledWatchfaces extends AbstractAppManagerFragment {
|
||||||
@Override
|
@Override
|
||||||
public void refreshList() {
|
protected void refreshList() {
|
||||||
appList.addAll(getSystemWatchfaces());
|
appList.clear();
|
||||||
|
ArrayList uuids = AppManagerActivity.getUuidsFromFile(getSortFilename());
|
||||||
|
if (uuids.isEmpty()) {
|
||||||
|
appList.addAll(getSystemWatchfaces());
|
||||||
|
for (GBDeviceApp gbDeviceApp : appList) {
|
||||||
|
uuids.add(gbDeviceApp.getUUID());
|
||||||
|
}
|
||||||
|
AppManagerActivity.rewriteAppOrderFile(getSortFilename(), uuids);
|
||||||
|
} else {
|
||||||
|
appList.addAll(getCachedApps(uuids));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getSortFilename() {
|
@Override
|
||||||
|
protected String getSortFilename() {
|
||||||
return mGBDevice.getAddress() + ".watchfaces";
|
return mGBDevice.getAddress() + ".watchfaces";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onChangedAppOrder() {
|
||||||
|
super.onChangedAppOrder();
|
||||||
|
sendOrderToDevice(mGBDevice.getAddress() + ".watchapps");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -59,10 +59,6 @@ public class GBDeviceAppAdapter extends DragItemAdapter<GBDeviceApp, GBDeviceApp
|
|||||||
holder.mDeviceAppVersionAuthorLabel.setText(GBApplication.getContext().getString(R.string.appversion_by_creator, deviceApp.getVersion(), deviceApp.getCreator()));
|
holder.mDeviceAppVersionAuthorLabel.setText(GBApplication.getContext().getString(R.string.appversion_by_creator, deviceApp.getVersion(), deviceApp.getCreator()));
|
||||||
// FIXME: replace with small icons
|
// FIXME: replace with small icons
|
||||||
String appNameLabelText = deviceApp.getName();
|
String appNameLabelText = deviceApp.getName();
|
||||||
if (deviceApp.isInCache() || deviceApp.isOnDevice()) {
|
|
||||||
appNameLabelText += " (" + (deviceApp.isInCache() ? "C" : "")
|
|
||||||
+ (deviceApp.isOnDevice() ? "D" : "") + ")";
|
|
||||||
}
|
|
||||||
holder.mDeviceAppNameLabel.setText(appNameLabelText);
|
holder.mDeviceAppNameLabel.setText(appNameLabelText);
|
||||||
|
|
||||||
switch (deviceApp.getType()) {
|
switch (deviceApp.getType()) {
|
||||||
|
@ -18,6 +18,7 @@ import java.io.Writer;
|
|||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.R;
|
import nodomain.freeyourgadget.gadgetbridge.R;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.activities.InstallActivity;
|
import nodomain.freeyourgadget.gadgetbridge.activities.InstallActivity;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.activities.appmanager.AppManagerActivity;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler;
|
import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.impl.GBDeviceApp;
|
import nodomain.freeyourgadget.gadgetbridge.impl.GBDeviceApp;
|
||||||
@ -135,6 +136,8 @@ public class PBWInstallHandler implements InstallHandler {
|
|||||||
destDir = new File(FileUtils.getExternalFilesDir() + "/pbw-cache");
|
destDir = new File(FileUtils.getExternalFilesDir() + "/pbw-cache");
|
||||||
destDir.mkdirs();
|
destDir.mkdirs();
|
||||||
FileUtils.copyURItoFile(mContext, mUri, new File(destDir, app.getUUID().toString() + ".pbw"));
|
FileUtils.copyURItoFile(mContext, mUri, new File(destDir, app.getUUID().toString() + ".pbw"));
|
||||||
|
|
||||||
|
AppManagerActivity.addToAppOrderFile("pbwcacheorder.txt", app.getUUID());
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
LOG.error("Installation failed: " + e.getMessage(), e);
|
LOG.error("Installation failed: " + e.getMessage(), e);
|
||||||
return;
|
return;
|
||||||
@ -174,6 +177,7 @@ public class PBWInstallHandler implements InstallHandler {
|
|||||||
LOG.error("Failed to open output file: " + e.getMessage(), e);
|
LOG.error("Failed to open output file: " + e.getMessage(), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isValid() {
|
public boolean isValid() {
|
||||||
|
@ -9,6 +9,7 @@ import android.content.Intent;
|
|||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.ParcelUuid;
|
import android.os.ParcelUuid;
|
||||||
|
import android.support.v4.content.LocalBroadcastManager;
|
||||||
|
|
||||||
import org.json.JSONArray;
|
import org.json.JSONArray;
|
||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
@ -28,6 +29,8 @@ import java.util.UUID;
|
|||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.R;
|
import nodomain.freeyourgadget.gadgetbridge.R;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.activities.appmanager.AbstractAppManagerFragment;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.activities.appmanager.AppManagerActivity;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEvent;
|
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEvent;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventAppInfo;
|
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventAppInfo;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventAppManagement;
|
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventAppManagement;
|
||||||
@ -75,6 +78,7 @@ public class PebbleIoThread extends GBDeviceIoThread {
|
|||||||
private boolean mIsInstalling = false;
|
private boolean mIsInstalling = false;
|
||||||
|
|
||||||
private PBWReader mPBWReader = null;
|
private PBWReader mPBWReader = null;
|
||||||
|
private GBDeviceApp mCurrentlyInstallingApp = null;
|
||||||
private int mAppInstallToken = -1;
|
private int mAppInstallToken = -1;
|
||||||
private InputStream mFis = null;
|
private InputStream mFis = null;
|
||||||
private PebbleAppInstallState mInstallState = PebbleAppInstallState.UNKNOWN;
|
private PebbleAppInstallState mInstallState = PebbleAppInstallState.UNKNOWN;
|
||||||
@ -613,12 +617,12 @@ public class PebbleIoThread extends GBDeviceIoThread {
|
|||||||
*/
|
*/
|
||||||
writeInstallApp(mPebbleProtocol.encodeGetTime());
|
writeInstallApp(mPebbleProtocol.encodeGetTime());
|
||||||
} else {
|
} else {
|
||||||
GBDeviceApp app = mPBWReader.getGBDeviceApp();
|
mCurrentlyInstallingApp = mPBWReader.getGBDeviceApp();
|
||||||
if (mPebbleProtocol.mFwMajor >= 3 && !mPBWReader.isLanguage()) {
|
if (mPebbleProtocol.mFwMajor >= 3 && !mPBWReader.isLanguage()) {
|
||||||
if (appId == 0) {
|
if (appId == 0) {
|
||||||
// only install metadata - not the binaries
|
// only install metadata - not the binaries
|
||||||
write(mPebbleProtocol.encodeInstallMetadata(app.getUUID(), app.getName(), mPBWReader.getAppVersion(), mPBWReader.getSdkVersion(), mPBWReader.getFlags(), mPBWReader.getIconId()));
|
write(mPebbleProtocol.encodeInstallMetadata(mCurrentlyInstallingApp.getUUID(), mCurrentlyInstallingApp.getName(), mPBWReader.getAppVersion(), mPBWReader.getSdkVersion(), mPBWReader.getFlags(), mPBWReader.getIconId()));
|
||||||
write(mPebbleProtocol.encodeAppStart(app.getUUID(), true));
|
write(mPebbleProtocol.encodeAppStart(mCurrentlyInstallingApp.getUUID(), true));
|
||||||
} else {
|
} else {
|
||||||
// this came from an app fetch request, so do the real stuff
|
// this came from an app fetch request, so do the real stuff
|
||||||
mIsInstalling = true;
|
mIsInstalling = true;
|
||||||
@ -637,7 +641,7 @@ public class PebbleIoThread extends GBDeviceIoThread {
|
|||||||
writeInstallApp(mPebbleProtocol.encodeGetTime());
|
writeInstallApp(mPebbleProtocol.encodeGetTime());
|
||||||
} else {
|
} else {
|
||||||
mInstallState = PebbleAppInstallState.WAIT_SLOT;
|
mInstallState = PebbleAppInstallState.WAIT_SLOT;
|
||||||
writeInstallApp(mPebbleProtocol.encodeAppDelete(app.getUUID()));
|
writeInstallApp(mPebbleProtocol.encodeAppDelete(mCurrentlyInstallingApp.getUUID()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -651,6 +655,17 @@ public class PebbleIoThread extends GBDeviceIoThread {
|
|||||||
GB.updateInstallNotification(getContext().getString(R.string.installation_failed_), false, 0, getContext());
|
GB.updateInstallNotification(getContext().getString(R.string.installation_failed_), false, 0, getContext());
|
||||||
} else {
|
} else {
|
||||||
GB.updateInstallNotification(getContext().getString(R.string.installation_successful), false, 0, getContext());
|
GB.updateInstallNotification(getContext().getString(R.string.installation_successful), false, 0, getContext());
|
||||||
|
String filenameSuffix;
|
||||||
|
if (mCurrentlyInstallingApp != null) {
|
||||||
|
if (mCurrentlyInstallingApp.getType() == GBDeviceApp.Type.WATCHFACE) {
|
||||||
|
filenameSuffix = ".watchfaces";
|
||||||
|
} else {
|
||||||
|
filenameSuffix = ".watchapps";
|
||||||
|
}
|
||||||
|
AppManagerActivity.addToAppOrderFile(gbDevice.getAddress() + filenameSuffix, mCurrentlyInstallingApp.getUUID());
|
||||||
|
Intent refreshIntent = new Intent(AbstractAppManagerFragment.ACTION_REFRESH_APPLIST);
|
||||||
|
LocalBroadcastManager.getInstance(getContext()).sendBroadcast(refreshIntent);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
mInstallState = PebbleAppInstallState.UNKNOWN;
|
mInstallState = PebbleAppInstallState.UNKNOWN;
|
||||||
|
|
||||||
@ -660,6 +675,8 @@ public class PebbleIoThread extends GBDeviceIoThread {
|
|||||||
|
|
||||||
mPBWReader = null;
|
mPBWReader = null;
|
||||||
mIsInstalling = false;
|
mIsInstalling = false;
|
||||||
|
mCurrentlyInstallingApp = null;
|
||||||
|
|
||||||
if (mFis != null) {
|
if (mFis != null) {
|
||||||
try {
|
try {
|
||||||
mFis.close();
|
mFis.close();
|
||||||
|
Loading…
Reference in New Issue
Block a user