Removed SwapAppListActivity, implemented UI mockup for swap app list.
Still need to hook up the buttons in the app list, but this change shows the correct status and/or buttons for installable/upgradable/ incompatible/installed apps in the swap list. This change also hooks up UIL to download icons for apps and thus display them in the list.
This commit is contained in:
parent
f236dc3d3e
commit
a8dedd8ac2
@ -359,12 +359,12 @@
|
|||||||
|
|
||||||
</activity>
|
</activity>
|
||||||
<activity
|
<activity
|
||||||
android:name=".views.swap.SwapAppListActivity$SwapAppDetails"
|
android:name=".views.swap.SwapWorkflowActivity$SwapAppDetails"
|
||||||
android:label="@string/app_details"
|
android:label="@string/app_details"
|
||||||
android:parentActivityName=".views.swap.SwapAppListActivity" >
|
android:parentActivityName=".views.swap.SwapWorkflowActivity" >
|
||||||
<meta-data
|
<meta-data
|
||||||
android:name="android.support.PARENT_ACTIVITY"
|
android:name="android.support.PARENT_ACTIVITY"
|
||||||
android:value=".views.swap.SwapAppListActivity" />
|
android:value=".views.swap.SwapWorkflowActivity" />
|
||||||
</activity>
|
</activity>
|
||||||
<activity
|
<activity
|
||||||
android:label="@string/menu_preferences"
|
android:label="@string/menu_preferences"
|
||||||
@ -385,17 +385,6 @@
|
|||||||
android:name="android.support.PARENT_ACTIVITY"
|
android:name="android.support.PARENT_ACTIVITY"
|
||||||
android:value=".FDroid" />
|
android:value=".FDroid" />
|
||||||
</activity>
|
</activity>
|
||||||
<activity
|
|
||||||
android:label="@string/swap"
|
|
||||||
android:name=".views.swap.SwapAppListActivity"
|
|
||||||
android:parentActivityName=".FDroid"
|
|
||||||
android:theme="@style/SwapTheme.AppList"
|
|
||||||
android:screenOrientation="portrait"
|
|
||||||
android:configChanges="orientation|keyboardHidden">
|
|
||||||
<meta-data
|
|
||||||
android:name="android.support.PARENT_ACTIVITY"
|
|
||||||
android:value=".FDroid" />
|
|
||||||
</activity>
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".SearchResults"
|
android:name=".SearchResults"
|
||||||
android:label="@string/search_results"
|
android:label="@string/search_results"
|
||||||
|
@ -16,30 +16,47 @@
|
|||||||
android:layout_alignParentStart="true"
|
android:layout_alignParentStart="true"
|
||||||
tools:src="@drawable/ic_launcher" />
|
tools:src="@drawable/ic_launcher" />
|
||||||
|
|
||||||
<RelativeLayout
|
<LinearLayout
|
||||||
android:id="@+id/button_or_text"
|
android:id="@+id/button_or_text"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_alignParentEnd="true"
|
android:layout_alignParentEnd="true"
|
||||||
android:layout_centerInParent="true"
|
android:layout_centerInParent="true"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:gravity="end"
|
||||||
android:layout_marginEnd="?android:attr/listPreferredItemPaddingEnd">
|
android:layout_marginEnd="?android:attr/listPreferredItemPaddingEnd">
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/button"
|
android:id="@+id/btn_install"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:tint="@color/fdroid_green"
|
android:backgroundTint="@color/swap_light_blue"
|
||||||
android:textColor="@android:color/white"
|
android:textColor="@android:color/white"
|
||||||
tools:text="Install"/>
|
android:text="@string/menu_install"/>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/status"
|
android:id="@+id/status_installed"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:textColor="@color/fdroid_green"
|
android:textStyle="italic"
|
||||||
tools:text="Installed" />
|
android:text="@string/inst" />
|
||||||
|
|
||||||
</RelativeLayout>
|
<TextView
|
||||||
|
android:id="@+id/status_incompatible"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textStyle="italic"
|
||||||
|
android:textColor="@color/swap_incompatible"
|
||||||
|
android:text="@string/incompatible" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/btn_attempt_install"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textColor="@color/swap_light_blue"
|
||||||
|
android:text="@string/swap_attempt_install" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/name"
|
android:id="@+id/name"
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
<color name="fdroid_blue_dark">#ff4b7195</color>
|
<color name="fdroid_blue_dark">#ff4b7195</color>
|
||||||
<color name="fdroid_green">#FFAAD024</color>
|
<color name="fdroid_green">#FFAAD024</color>
|
||||||
|
|
||||||
|
<color name="swap_incompatible">#ff7900</color>
|
||||||
<color name="swap_light_blue">#27aae1</color>
|
<color name="swap_light_blue">#27aae1</color>
|
||||||
<color name="swap_light_blue_pressed">#ff98cce1</color>
|
<color name="swap_light_blue_pressed">#ff98cce1</color>
|
||||||
<color name="swap_blue">#1c6bbc</color>
|
<color name="swap_blue">#1c6bbc</color>
|
||||||
|
@ -348,4 +348,5 @@
|
|||||||
<string name="wifi_warning_private">Promising</string>
|
<string name="wifi_warning_private">Promising</string>
|
||||||
<string name="wifi_warning_personal">Best bet</string>
|
<string name="wifi_warning_personal">Best bet</string>
|
||||||
<string name="loading">Loading...</string>
|
<string name="loading">Loading...</string>
|
||||||
|
<string name="swap_attempt_install">TRY TO INSTALL</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -23,6 +23,7 @@ import android.content.pm.PackageManager;
|
|||||||
import android.content.res.AssetManager;
|
import android.content.res.AssetManager;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.content.res.XmlResourceParser;
|
import android.content.res.XmlResourceParser;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
@ -32,6 +33,9 @@ import android.text.TextUtils;
|
|||||||
import android.util.DisplayMetrics;
|
import android.util.DisplayMetrics;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import com.nostra13.universalimageloader.core.DisplayImageOptions;
|
||||||
|
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
|
||||||
|
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
|
||||||
import com.nostra13.universalimageloader.utils.StorageUtils;
|
import com.nostra13.universalimageloader.utils.StorageUtils;
|
||||||
|
|
||||||
import org.fdroid.fdroid.compat.FileCompat;
|
import org.fdroid.fdroid.compat.FileCompat;
|
||||||
@ -489,6 +493,17 @@ public final class Utils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static DisplayImageOptions.Builder getImageLoadingOptions() {
|
||||||
|
return new DisplayImageOptions.Builder()
|
||||||
|
.cacheInMemory(true)
|
||||||
|
.cacheOnDisk(true)
|
||||||
|
.imageScaleType(ImageScaleType.NONE)
|
||||||
|
.showImageOnLoading(R.drawable.ic_repo_app_default)
|
||||||
|
.showImageForEmptyUri(R.drawable.ic_repo_app_default)
|
||||||
|
.displayer(new FadeInBitmapDisplayer(200, true, true, false))
|
||||||
|
.bitmapConfig(Bitmap.Config.RGB_565);
|
||||||
|
}
|
||||||
|
|
||||||
// this is all new stuff being added
|
// this is all new stuff being added
|
||||||
public static String hashBytes(byte[] input, String algo) {
|
public static String hashBytes(byte[] input, String algo) {
|
||||||
try {
|
try {
|
||||||
|
@ -159,7 +159,7 @@ public class SwapService extends Service {
|
|||||||
// Only ask server to swap with us, if we are actually running a local repo service.
|
// Only ask server to swap with us, if we are actually running a local repo service.
|
||||||
// It is possible to have a swap initiated without first starting a swap, in which
|
// It is possible to have a swap initiated without first starting a swap, in which
|
||||||
// case swapping back is pointless.
|
// case swapping back is pointless.
|
||||||
if (isEnabled()) {
|
if (isEnabled() && requestSwapBack) {
|
||||||
askServerToSwapWithUs(peerRepo);
|
askServerToSwapWithUs(peerRepo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,6 +45,11 @@ public class BluetoothPeer implements Peer {
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldPromptForSwapBack() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int describeContents() {
|
public int describeContents() {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package org.fdroid.fdroid.localrepo.peers;
|
package org.fdroid.fdroid.localrepo.peers;
|
||||||
|
|
||||||
|
import android.net.Uri;
|
||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
|
|
||||||
import javax.jmdns.impl.FDroidServiceInfo;
|
import javax.jmdns.impl.FDroidServiceInfo;
|
||||||
@ -11,6 +12,8 @@ public class BonjourPeer extends WifiPeer {
|
|||||||
|
|
||||||
public BonjourPeer(ServiceInfo serviceInfo) {
|
public BonjourPeer(ServiceInfo serviceInfo) {
|
||||||
this.serviceInfo = new FDroidServiceInfo(serviceInfo);
|
this.serviceInfo = new FDroidServiceInfo(serviceInfo);
|
||||||
|
this.name = serviceInfo.getDomain();
|
||||||
|
this.uri = Uri.parse(this.serviceInfo.getRepoAddress());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -14,4 +14,6 @@ public interface Peer extends Parcelable {
|
|||||||
String getRepoAddress();
|
String getRepoAddress();
|
||||||
|
|
||||||
String getFingerprint();
|
String getFingerprint();
|
||||||
|
|
||||||
|
boolean shouldPromptForSwapBack();
|
||||||
}
|
}
|
||||||
|
@ -10,18 +10,20 @@ public class WifiPeer implements Peer {
|
|||||||
|
|
||||||
protected String name;
|
protected String name;
|
||||||
protected Uri uri;
|
protected Uri uri;
|
||||||
|
protected boolean shouldPromptForSwapBack;
|
||||||
|
|
||||||
public WifiPeer() {
|
public WifiPeer() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public WifiPeer(NewRepoConfig config) {
|
public WifiPeer(NewRepoConfig config) {
|
||||||
this(config.getRepoUri(), config.getHost());
|
this(config.getRepoUri(), config.getHost(), !config.preventFurtherSwaps());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected WifiPeer(Uri uri, String name) {
|
protected WifiPeer(Uri uri, String name, boolean shouldPromptForSwapBack) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.uri = uri;
|
this.uri = uri;
|
||||||
|
this.shouldPromptForSwapBack = shouldPromptForSwapBack;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -44,6 +46,12 @@ public class WifiPeer implements Peer {
|
|||||||
return uri.getQueryParameter("fingerprint");
|
return uri.getQueryParameter("fingerprint");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldPromptForSwapBack() {
|
||||||
|
return shouldPromptForSwapBack;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int describeContents() {
|
public int describeContents() {
|
||||||
return 0;
|
return 0;
|
||||||
@ -53,10 +61,11 @@ public class WifiPeer implements Peer {
|
|||||||
public void writeToParcel(Parcel dest, int flags) {
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
dest.writeString(name);
|
dest.writeString(name);
|
||||||
dest.writeString(uri.toString());
|
dest.writeString(uri.toString());
|
||||||
|
dest.writeByte(shouldPromptForSwapBack ? (byte) 1 : (byte) 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected WifiPeer(Parcel in) {
|
protected WifiPeer(Parcel in) {
|
||||||
this(Uri.parse(in.readString()), in.readString());
|
this(Uri.parse(in.readString()), in.readString(), in.readByte() == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final Creator<WifiPeer> CREATOR = new Creator<WifiPeer>() {
|
public static final Creator<WifiPeer> CREATOR = new Creator<WifiPeer>() {
|
||||||
|
@ -18,6 +18,7 @@ import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
|
|||||||
|
|
||||||
import org.fdroid.fdroid.Preferences;
|
import org.fdroid.fdroid.Preferences;
|
||||||
import org.fdroid.fdroid.R;
|
import org.fdroid.fdroid.R;
|
||||||
|
import org.fdroid.fdroid.Utils;
|
||||||
import org.fdroid.fdroid.data.App;
|
import org.fdroid.fdroid.data.App;
|
||||||
|
|
||||||
abstract public class AppListAdapter extends CursorAdapter {
|
abstract public class AppListAdapter extends CursorAdapter {
|
||||||
@ -50,15 +51,7 @@ abstract public class AppListAdapter extends CursorAdapter {
|
|||||||
mContext = context;
|
mContext = context;
|
||||||
mInflater = (LayoutInflater) mContext.getSystemService(
|
mInflater = (LayoutInflater) mContext.getSystemService(
|
||||||
Context.LAYOUT_INFLATER_SERVICE);
|
Context.LAYOUT_INFLATER_SERVICE);
|
||||||
displayImageOptions = new DisplayImageOptions.Builder()
|
displayImageOptions = Utils.getImageLoadingOptions().build();
|
||||||
.cacheInMemory(true)
|
|
||||||
.cacheOnDisk(true)
|
|
||||||
.imageScaleType(ImageScaleType.NONE)
|
|
||||||
.showImageOnLoading(R.drawable.ic_repo_app_default)
|
|
||||||
.showImageForEmptyUri(R.drawable.ic_repo_app_default)
|
|
||||||
.displayer(new FadeInBitmapDisplayer(200, true, true, false))
|
|
||||||
.bitmapConfig(Bitmap.Config.RGB_565)
|
|
||||||
.build();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,137 +0,0 @@
|
|||||||
package org.fdroid.fdroid.views.swap;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.net.Uri;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.os.Handler;
|
|
||||||
import android.support.annotation.Nullable;
|
|
||||||
import android.support.v4.app.NavUtils;
|
|
||||||
import android.support.v7.app.ActionBarActivity;
|
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
import org.fdroid.fdroid.AppDetails;
|
|
||||||
import org.fdroid.fdroid.R;
|
|
||||||
import org.fdroid.fdroid.data.AppProvider;
|
|
||||||
import org.fdroid.fdroid.data.Repo;
|
|
||||||
import org.fdroid.fdroid.data.RepoProvider;
|
|
||||||
import org.fdroid.fdroid.views.AppListAdapter;
|
|
||||||
import org.fdroid.fdroid.views.AvailableAppListAdapter;
|
|
||||||
import org.fdroid.fdroid.views.fragments.AppListFragment;
|
|
||||||
|
|
||||||
public class SwapAppListActivity extends ActionBarActivity {
|
|
||||||
|
|
||||||
private static final String TAG = "SwapAppListActivity";
|
|
||||||
|
|
||||||
public static final String EXTRA_REPO_ID = "repoId";
|
|
||||||
|
|
||||||
private Repo repo;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
|
||||||
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
|
|
||||||
if (savedInstanceState == null) {
|
|
||||||
|
|
||||||
// Necessary to run on an Android 2.3.[something] device.
|
|
||||||
new Handler().post(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
getSupportFragmentManager()
|
|
||||||
.beginTransaction()
|
|
||||||
.add(android.R.id.content, new SwapAppListFragment())
|
|
||||||
.commit();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onResume() {
|
|
||||||
super.onResume();
|
|
||||||
|
|
||||||
long repoAddress = getIntent().getLongExtra(EXTRA_REPO_ID, -1);
|
|
||||||
repo = RepoProvider.Helper.findById(this, repoAddress);
|
|
||||||
if (repo == null) {
|
|
||||||
Log.e(TAG, "Couldn't show swap app list for repo " + repoAddress);
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Repo getRepo() {
|
|
||||||
return repo;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class SwapAppListFragment extends AppListFragment {
|
|
||||||
|
|
||||||
private Repo repo;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onAttach(Activity activity) {
|
|
||||||
super.onAttach(activity);
|
|
||||||
repo = ((SwapAppListActivity)activity).getRepo();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected int getHeaderLayout() {
|
|
||||||
return R.layout.swap_success_header;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected AppListAdapter getAppListAdapter() {
|
|
||||||
return new AvailableAppListAdapter(getActivity(), null);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
protected String getEmptyMessage() {
|
|
||||||
return getActivity().getString(R.string.empty_swap_app_list);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String getFromTitle() {
|
|
||||||
return getString(R.string.swap);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Uri getDataUri() {
|
|
||||||
return AppProvider.getRepoUri(repo);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Intent getAppDetailsIntent() {
|
|
||||||
Intent intent = new Intent(getActivity(), SwapAppDetails.class);
|
|
||||||
intent.putExtra(EXTRA_REPO_ID, repo.getId());
|
|
||||||
return intent;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Only difference from base class is that it navigates up to a different task.
|
|
||||||
* It will go to the {@link org.fdroid.fdroid.views.swap.SwapAppListActivity}
|
|
||||||
* whereas the baseclass will go back to the main list of apps. Need to juggle
|
|
||||||
* the repoId in order to be able to return to an appropriately configured swap
|
|
||||||
* list (see {@link org.fdroid.fdroid.views.swap.SwapAppListActivity.SwapAppListFragment#getAppDetailsIntent()}).
|
|
||||||
*/
|
|
||||||
public static class SwapAppDetails extends AppDetails {
|
|
||||||
|
|
||||||
private long repoId;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onResume() {
|
|
||||||
super.onResume();
|
|
||||||
repoId = getIntent().getLongExtra(EXTRA_REPO_ID, -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void navigateUp() {
|
|
||||||
Intent parentIntent = NavUtils.getParentActivityIntent(this);
|
|
||||||
parentIntent.putExtra(EXTRA_REPO_ID, repoId);
|
|
||||||
NavUtils.navigateUpTo(this, parentIntent);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -32,9 +32,13 @@ import android.widget.ImageView;
|
|||||||
import android.widget.ListView;
|
import android.widget.ListView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import com.nostra13.universalimageloader.core.DisplayImageOptions;
|
||||||
|
import com.nostra13.universalimageloader.core.ImageLoader;
|
||||||
|
|
||||||
import org.fdroid.fdroid.ProgressListener;
|
import org.fdroid.fdroid.ProgressListener;
|
||||||
import org.fdroid.fdroid.R;
|
import org.fdroid.fdroid.R;
|
||||||
import org.fdroid.fdroid.UpdateService;
|
import org.fdroid.fdroid.UpdateService;
|
||||||
|
import org.fdroid.fdroid.Utils;
|
||||||
import org.fdroid.fdroid.data.App;
|
import org.fdroid.fdroid.data.App;
|
||||||
import org.fdroid.fdroid.data.AppProvider;
|
import org.fdroid.fdroid.data.AppProvider;
|
||||||
import org.fdroid.fdroid.data.Repo;
|
import org.fdroid.fdroid.data.Repo;
|
||||||
@ -48,6 +52,8 @@ public class SwapAppsView extends ListView implements
|
|||||||
LoaderManager.LoaderCallbacks<Cursor>,
|
LoaderManager.LoaderCallbacks<Cursor>,
|
||||||
SearchView.OnQueryTextListener {
|
SearchView.OnQueryTextListener {
|
||||||
|
|
||||||
|
private DisplayImageOptions displayImageOptions;
|
||||||
|
|
||||||
public SwapAppsView(Context context) {
|
public SwapAppsView(Context context) {
|
||||||
super(context);
|
super(context);
|
||||||
}
|
}
|
||||||
@ -104,6 +110,8 @@ public class SwapAppsView extends ListView implements
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
displayImageOptions = Utils.getImageLoadingOptions().build();
|
||||||
|
|
||||||
schedulePollForUpdates();
|
schedulePollForUpdates();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -279,46 +287,45 @@ public class SwapAppsView extends ListView implements
|
|||||||
|
|
||||||
TextView nameView = (TextView)view.findViewById(R.id.name);
|
TextView nameView = (TextView)view.findViewById(R.id.name);
|
||||||
ImageView iconView = (ImageView)view.findViewById(android.R.id.icon);
|
ImageView iconView = (ImageView)view.findViewById(android.R.id.icon);
|
||||||
Button button = (Button)view.findViewById(R.id.button);
|
Button btnInstall = (Button)view.findViewById(R.id.btn_install);
|
||||||
TextView status = (TextView)view.findViewById(R.id.status);
|
TextView btnAttemptInstall = (TextView)view.findViewById(R.id.btn_attempt_install);
|
||||||
|
TextView statusInstalled = (TextView)view.findViewById(R.id.status_installed);
|
||||||
|
TextView statusIncompatible = (TextView)view.findViewById(R.id.status_incompatible);
|
||||||
|
|
||||||
final App app = new App(cursor);
|
final App app = new App(cursor);
|
||||||
|
|
||||||
nameView.setText(app.name);
|
nameView.setText(app.name);
|
||||||
iconView.setImageDrawable(getDefaultAppIcon(context)); // TODO: Load icon from repo properly using UIL.
|
ImageLoader.getInstance().displayImage(app.iconUrl, iconView, displayImageOptions);
|
||||||
|
|
||||||
|
btnInstall.setVisibility(View.GONE);
|
||||||
|
btnAttemptInstall.setVisibility(View.GONE);
|
||||||
|
statusInstalled.setVisibility(View.GONE);
|
||||||
|
statusIncompatible.setVisibility(View.GONE);
|
||||||
|
|
||||||
if (app.hasUpdates()) {
|
if (app.hasUpdates()) {
|
||||||
button.setText(R.string.menu_upgrade);
|
btnInstall.setText(R.string.menu_upgrade);
|
||||||
button.setEnabled(true);
|
btnInstall.setVisibility(View.VISIBLE);
|
||||||
button.setBackgroundColor(getResources().getColor(R.color.fdroid_blue));
|
|
||||||
button.setVisibility(View.VISIBLE);
|
|
||||||
status.setVisibility(View.GONE);
|
|
||||||
} else if (app.isInstalled()) {
|
} else if (app.isInstalled()) {
|
||||||
status.setText(R.string.inst);
|
statusInstalled.setVisibility(View.VISIBLE);
|
||||||
status.setTextColor(getResources().getColor(R.color.fdroid_green));
|
|
||||||
status.setVisibility(View.VISIBLE);
|
|
||||||
button.setVisibility(View.GONE);
|
|
||||||
} else if (!app.compatible) {
|
} else if (!app.compatible) {
|
||||||
status.setText(R.string.incompatible);
|
btnAttemptInstall.setVisibility(View.VISIBLE);
|
||||||
status.setTextColor(getResources().getColor(R.color.swap_light_grey_icon));
|
statusIncompatible.setVisibility(View.VISIBLE);
|
||||||
status.setVisibility(View.VISIBLE);
|
|
||||||
button.setVisibility(View.GONE);
|
|
||||||
} else {
|
} else {
|
||||||
button.setText(R.string.menu_install);
|
btnInstall.setText(R.string.menu_install);
|
||||||
button.setEnabled(true);
|
btnInstall.setVisibility(View.VISIBLE);
|
||||||
button.setBackgroundColor(getResources().getColor(R.color.fdroid_green));
|
|
||||||
button.setVisibility(View.VISIBLE);
|
|
||||||
status.setVisibility(View.GONE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
button.setOnClickListener(new OnClickListener() {
|
OnClickListener installListener = new OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
if (app.hasUpdates() || app.compatible) {
|
if (app.hasUpdates() || app.compatible) {
|
||||||
getState().install(app);
|
getState().install(app);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
|
|
||||||
|
btnInstall.setOnClickListener(installListener);
|
||||||
|
btnAttemptInstall.setOnClickListener(installListener);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -61,10 +61,10 @@ public class SwapConnecting extends LinearLayout implements SwapWorkflowActivity
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
String heading = getContext().getString(R.string.status_connecting_to_repo, getActivity().getState().getPeer().getName());
|
String heading = getContext().getString(R.string.status_connecting_to_repo, peer.getName());
|
||||||
((TextView) findViewById(R.id.heading)).setText(heading);
|
((TextView) findViewById(R.id.heading)).setText(heading);
|
||||||
|
|
||||||
UpdateService.UpdateReceiver receiver = getManager().connectTo(peer, true);
|
UpdateService.UpdateReceiver receiver = getManager().connectTo(peer, peer.shouldPromptForSwapBack());
|
||||||
|
|
||||||
receiver.hideDialog();
|
receiver.hideDialog();
|
||||||
receiver.setListener(new ProgressListener() {
|
receiver.setListener(new ProgressListener() {
|
||||||
|
@ -14,6 +14,7 @@ import android.support.annotation.ColorRes;
|
|||||||
import android.support.annotation.LayoutRes;
|
import android.support.annotation.LayoutRes;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
|
import android.support.v4.app.NavUtils;
|
||||||
import android.support.v7.app.AppCompatActivity;
|
import android.support.v7.app.AppCompatActivity;
|
||||||
import android.support.v7.widget.Toolbar;
|
import android.support.v7.widget.Toolbar;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
@ -27,6 +28,7 @@ import android.widget.Toast;
|
|||||||
import com.google.zxing.integration.android.IntentIntegrator;
|
import com.google.zxing.integration.android.IntentIntegrator;
|
||||||
import com.google.zxing.integration.android.IntentResult;
|
import com.google.zxing.integration.android.IntentResult;
|
||||||
|
|
||||||
|
import org.fdroid.fdroid.AppDetails;
|
||||||
import org.fdroid.fdroid.FDroidApp;
|
import org.fdroid.fdroid.FDroidApp;
|
||||||
import org.fdroid.fdroid.NfcHelper;
|
import org.fdroid.fdroid.NfcHelper;
|
||||||
import org.fdroid.fdroid.Preferences;
|
import org.fdroid.fdroid.Preferences;
|
||||||
@ -41,6 +43,11 @@ import java.util.Arrays;
|
|||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This activity will do its best to show the most relevant screen about swapping to the user.
|
||||||
|
* The problem comes when there are two competing goals - 1) Show the user a list of apps from another
|
||||||
|
* device to download and install, and 2) Prepare your own list of apps to share.
|
||||||
|
*/
|
||||||
public class SwapWorkflowActivity extends AppCompatActivity {
|
public class SwapWorkflowActivity extends AppCompatActivity {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -52,6 +59,7 @@ public class SwapWorkflowActivity extends AppCompatActivity {
|
|||||||
*/
|
*/
|
||||||
public static final String EXTRA_PREVENT_FURTHER_SWAP_REQUESTS = "preventFurtherSwap";
|
public static final String EXTRA_PREVENT_FURTHER_SWAP_REQUESTS = "preventFurtherSwap";
|
||||||
public static final String EXTRA_CONFIRM = "EXTRA_CONFIRM";
|
public static final String EXTRA_CONFIRM = "EXTRA_CONFIRM";
|
||||||
|
public static final String EXTRA_REPO_ID = "repoId";
|
||||||
|
|
||||||
private ViewGroup container;
|
private ViewGroup container;
|
||||||
|
|
||||||
@ -213,6 +221,9 @@ public class SwapWorkflowActivity extends AppCompatActivity {
|
|||||||
case SwapService.STEP_WIFI_QR:
|
case SwapService.STEP_WIFI_QR:
|
||||||
showWifiQr();
|
showWifiQr();
|
||||||
break;
|
break;
|
||||||
|
case SwapService.STEP_SUCCESS:
|
||||||
|
showSwapConnected();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -375,10 +386,8 @@ public class SwapWorkflowActivity extends AppCompatActivity {
|
|||||||
*/
|
*/
|
||||||
public void swapWith(NewRepoConfig repoConfig) {
|
public void swapWith(NewRepoConfig repoConfig) {
|
||||||
getService().swapWith(repoConfig.toPeer());
|
getService().swapWith(repoConfig.toPeer());
|
||||||
if (!repoConfig.preventFurtherSwaps()) {
|
|
||||||
startSwappingWithPeer();
|
startSwappingWithPeer();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public void denySwap() {
|
public void denySwap() {
|
||||||
showIntro();
|
showIntro();
|
||||||
@ -504,4 +513,30 @@ public class SwapWorkflowActivity extends AppCompatActivity {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Only difference from base class is that it navigates up to a different task.
|
||||||
|
* It will go to the {@link org.fdroid.fdroid.views.swap.SwapWorkflowActivity}
|
||||||
|
* whereas the base-class will go back to the main list of apps. Need to juggle
|
||||||
|
* the repoId in order to be able to return to an appropriately configured swap
|
||||||
|
* list.
|
||||||
|
*/
|
||||||
|
public static class SwapAppDetails extends AppDetails {
|
||||||
|
|
||||||
|
private long repoId;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
repoId = getIntent().getLongExtra(EXTRA_REPO_ID, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void navigateUp() {
|
||||||
|
Intent parentIntent = NavUtils.getParentActivityIntent(this);
|
||||||
|
parentIntent.putExtra(EXTRA_REPO_ID, repoId);
|
||||||
|
NavUtils.navigateUpTo(this, parentIntent);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user