mirror of
https://github.com/TwidereProject/Twidere-Android
synced 2025-02-17 04:00:48 +01:00
improved quick search bar user name validation
improved empty view ui for accounts and tabs fixed status viewer crashes
This commit is contained in:
parent
7b10cb3372
commit
100586d9cb
@ -224,6 +224,8 @@ public interface SharedPreferenceConstants {
|
||||
public static final String KEY_UCD_DATA_PROFILING = "ucd_data_profiling";
|
||||
@Preference(type = BOOLEAN, exportable = false)
|
||||
public static final String KEY_SPICE_DATA_PROFILING = "spice_data_profiling";
|
||||
@Preference(type = STRING, exportable = false)
|
||||
public static final String KEY_SPICE_DEVICE_ID = "spice_device_id";
|
||||
@Preference(type = BOOLEAN, exportable = false)
|
||||
public static final String KEY_SHOW_UCD_DATA_PROFILING_REQUEST = "show_ucd_data_profiling_request";
|
||||
@Preference(type = BOOLEAN, exportable = false)
|
||||
|
@ -6,18 +6,16 @@ import android.content.IntentFilter;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.BatteryManager;
|
||||
import android.os.Build;
|
||||
import android.provider.Settings;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
|
||||
import org.mariotaku.twidere.Constants;
|
||||
import org.mariotaku.twidere.model.ParcelableAccount;
|
||||
import org.mariotaku.twidere.util.Utils;
|
||||
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.OutputStreamWriter;
|
||||
|
||||
import edu.tsinghua.spice.Task.SpiceAsyUploadTask;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* Created by Denny C. Ng on 2/20/15.
|
||||
@ -53,7 +51,7 @@ public class SpiceProfilingUtil {
|
||||
}
|
||||
|
||||
public static void profile(final Context context, final long account_id, final String text) {
|
||||
profile(context, account_id + "_" + FILE_NAME_PROFILE , text);
|
||||
profile(context, account_id + "_" + FILE_NAME_PROFILE, text);
|
||||
}
|
||||
|
||||
public static void profile(final Context context, final String name, final String text) {
|
||||
@ -61,10 +59,18 @@ public class SpiceProfilingUtil {
|
||||
final SharedPreferences prefs = context.getSharedPreferences(Constants.SHARED_PREFERENCES_NAME,
|
||||
Context.MODE_PRIVATE);
|
||||
if (!prefs.getBoolean(Constants.KEY_SPICE_DATA_PROFILING, false)) return;
|
||||
|
||||
String uuid = "XXX";
|
||||
if (Build.SERIAL.length() > 0)
|
||||
uuid = Build.SERIAL;
|
||||
final String persistedDeviceId = prefs.getString(Constants.KEY_SPICE_DEVICE_ID, null);
|
||||
final String serial = String.valueOf(Build.SERIAL).replaceAll("[^\\w\\d]", "");
|
||||
final String uuid;
|
||||
if (!TextUtils.isEmpty(persistedDeviceId)) {
|
||||
uuid = persistedDeviceId.replaceAll("[^\\w\\d]", "");
|
||||
} else if (!TextUtils.isEmpty(serial)) {
|
||||
uuid = serial;
|
||||
prefs.edit().putString(Constants.KEY_SPICE_DEVICE_ID, serial).apply();
|
||||
} else {
|
||||
uuid = UUID.randomUUID().toString().replaceAll("[^\\w\\d]", "");
|
||||
prefs.edit().putString(Constants.KEY_SPICE_DEVICE_ID, uuid).apply();
|
||||
}
|
||||
final String filename = uuid + "_" + name + ".spi";
|
||||
new Thread() {
|
||||
@Override
|
||||
@ -79,7 +85,9 @@ public class SpiceProfilingUtil {
|
||||
} catch (final Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
;
|
||||
}.start();
|
||||
}
|
||||
}
|
||||
|
@ -637,7 +637,7 @@ public class QuickSearchBarActivity extends ThemedFragmentActivity implements On
|
||||
hasName = true;
|
||||
}
|
||||
}
|
||||
if (!hasName) {
|
||||
if (!hasName && mQuery.matches("(?i)[a-z0-9_]{1,20}")) {
|
||||
result.add(screenNamePos, new UserScreenNameItem(mQuery, mAccountId));
|
||||
}
|
||||
usersCursor.close();
|
||||
|
@ -47,7 +47,9 @@ import android.widget.AbsListView;
|
||||
import android.widget.AbsListView.MultiChoiceModeListener;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.AdapterView.OnItemClickListener;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.ListView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.mobeta.android.dslv.DragSortListView;
|
||||
import com.mobeta.android.dslv.DragSortListView.DropListener;
|
||||
@ -89,6 +91,8 @@ public class CustomTabsFragment extends BaseFragment implements LoaderCallbacks<
|
||||
private DragSortListView mListView;
|
||||
private View mEmptyView;
|
||||
private View mListContainer, mProgressContainer;
|
||||
private TextView mEmptyText;
|
||||
private ImageView mEmptyIcon;
|
||||
|
||||
@Override
|
||||
public void drop(final int from, final int to) {
|
||||
@ -127,6 +131,8 @@ public class CustomTabsFragment extends BaseFragment implements LoaderCallbacks<
|
||||
mListView.setOnItemClickListener(this);
|
||||
mListView.setAdapter(mAdapter);
|
||||
mListView.setEmptyView(mEmptyView);
|
||||
mEmptyText.setText(R.string.no_tab);
|
||||
mEmptyIcon.setImageResource(R.drawable.ic_info_tab);
|
||||
getLoaderManager().initLoader(0, null, this);
|
||||
setListShown(false);
|
||||
}
|
||||
@ -156,6 +162,8 @@ public class CustomTabsFragment extends BaseFragment implements LoaderCallbacks<
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
mListView = (DragSortListView) view.findViewById(android.R.id.list);
|
||||
mEmptyView = view.findViewById(android.R.id.empty);
|
||||
mEmptyIcon = (ImageView) view.findViewById(R.id.empty_icon);
|
||||
mEmptyText = (TextView) view.findViewById(R.id.empty_text);
|
||||
mListContainer = view.findViewById(R.id.list_container);
|
||||
mProgressContainer = view.findViewById(R.id.progress_container);
|
||||
}
|
||||
@ -209,7 +217,7 @@ public class CustomTabsFragment extends BaseFragment implements LoaderCallbacks<
|
||||
|
||||
@Override
|
||||
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
|
||||
return inflater.inflate(R.layout.fragment_custom_tabs, container, false);
|
||||
return inflater.inflate(R.layout.fragment_list_with_empty_view, container, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -30,7 +30,8 @@ import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.AbsListView;
|
||||
import android.widget.AdapterView.AdapterContextMenuInfo;
|
||||
import android.widget.ListView;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.mobeta.android.dslv.DragSortListView;
|
||||
import com.mobeta.android.dslv.DragSortListView.DropListener;
|
||||
@ -55,7 +56,7 @@ import java.util.ArrayList;
|
||||
/**
|
||||
* Created by mariotaku on 14/10/26.
|
||||
*/
|
||||
public class AccountsManagerFragment extends BaseSupportListFragment implements LoaderCallbacks<Cursor>, DropListener, OnSharedPreferenceChangeListener {
|
||||
public class AccountsManagerFragment extends BaseSupportFragment implements LoaderCallbacks<Cursor>, DropListener, OnSharedPreferenceChangeListener {
|
||||
|
||||
private static final String FRAGMENT_TAG_ACCOUNT_DELETION = "account_deletion";
|
||||
|
||||
@ -63,6 +64,19 @@ public class AccountsManagerFragment extends BaseSupportListFragment implements
|
||||
private SharedPreferences mPreferences;
|
||||
private ParcelableAccount mSelectedAccount;
|
||||
|
||||
private DragSortListView mListView;
|
||||
private View mEmptyView;
|
||||
private View mListContainer, mProgressContainer;
|
||||
private TextView mEmptyText;
|
||||
private ImageView mEmptyIcon;
|
||||
|
||||
|
||||
private void setListShown(boolean shown) {
|
||||
mListContainer.setVisibility(shown ? View.VISIBLE : View.GONE);
|
||||
mProgressContainer.setVisibility(shown ? View.GONE : View.VISIBLE);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
switch (item.getItemId()) {
|
||||
@ -170,10 +184,17 @@ public class AccountsManagerFragment extends BaseSupportListFragment implements
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onListItemClick(ListView l, View v, int position, long id) {
|
||||
l.showContextMenuForChild(v);
|
||||
public void onBaseViewCreated(View view, Bundle savedInstanceState) {
|
||||
super.onBaseViewCreated(view, savedInstanceState);
|
||||
mListView = (DragSortListView) view.findViewById(android.R.id.list);
|
||||
mEmptyView = view.findViewById(android.R.id.empty);
|
||||
mEmptyIcon = (ImageView) view.findViewById(R.id.empty_icon);
|
||||
mEmptyText = (TextView) view.findViewById(R.id.empty_text);
|
||||
mListContainer = view.findViewById(R.id.list_container);
|
||||
mProgressContainer = view.findViewById(R.id.progress_container);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
|
||||
if (!(menuInfo instanceof AdapterContextMenuInfo)) return;
|
||||
@ -202,22 +223,20 @@ public class AccountsManagerFragment extends BaseSupportListFragment implements
|
||||
mAdapter = new AccountsAdapter(activity);
|
||||
Utils.configBaseAdapter(activity, mAdapter);
|
||||
mAdapter.setSortEnabled(true);
|
||||
setListAdapter(mAdapter);
|
||||
final DragSortListView listView = (DragSortListView) getListView();
|
||||
listView.setDragEnabled(true);
|
||||
listView.setDropListener(this);
|
||||
listView.setOnCreateContextMenuListener(this);
|
||||
mListView.setAdapter(mAdapter);
|
||||
mListView.setDragEnabled(true);
|
||||
mListView.setDropListener(this);
|
||||
mListView.setOnCreateContextMenuListener(this);
|
||||
mListView.setEmptyView(mEmptyView);
|
||||
mEmptyText.setText(R.string.no_account);
|
||||
mEmptyIcon.setImageResource(R.drawable.ic_info_error_generic);
|
||||
getLoaderManager().initLoader(0, null, this);
|
||||
setListShown(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
|
||||
final View view = inflater.inflate(android.R.layout.list_content, null, false);
|
||||
final ListView originalList = (ListView) view.findViewById(android.R.id.list);
|
||||
final ViewGroup listContainer = (ViewGroup) originalList.getParent();
|
||||
listContainer.removeView(originalList);
|
||||
inflater.inflate(R.layout.fragment_custom_tabs, listContainer, true);
|
||||
return view;
|
||||
return inflater.inflate(R.layout.fragment_list_with_empty_view, container, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -228,6 +247,7 @@ public class AccountsManagerFragment extends BaseSupportListFragment implements
|
||||
|
||||
@Override
|
||||
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
|
||||
setListShown(true);
|
||||
mAdapter.changeCursor(cursor);
|
||||
}
|
||||
|
||||
@ -238,10 +258,9 @@ public class AccountsManagerFragment extends BaseSupportListFragment implements
|
||||
|
||||
@Override
|
||||
public void drop(int from, int to) {
|
||||
final DragSortListView listView = (DragSortListView) getListView();
|
||||
mAdapter.drop(from, to);
|
||||
if (listView.getChoiceMode() != AbsListView.CHOICE_MODE_NONE) {
|
||||
listView.moveCheckState(from, to);
|
||||
if (mListView.getChoiceMode() != AbsListView.CHOICE_MODE_NONE) {
|
||||
mListView.moveCheckState(from, to);
|
||||
}
|
||||
saveAccountPositions();
|
||||
}
|
||||
|
@ -525,9 +525,9 @@ public class StatusFragment extends BaseSupportFragment
|
||||
if (position == getItemCount() - 1) {
|
||||
return null;
|
||||
} else if (position < conversationCount) {
|
||||
return mConversation.get(position);
|
||||
return mConversation != null ? mConversation.get(position) : null;
|
||||
} else if (position > conversationCount) {
|
||||
return mReplies.get(position - conversationCount - 1);
|
||||
return mReplies != null ? mReplies.get(position - conversationCount - 1) : null;
|
||||
} else {
|
||||
return mStatus;
|
||||
}
|
||||
|
@ -340,7 +340,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
|
||||
mPagesErrorText.setText(getString(R.string.blocked_by_user_summary, displayName));
|
||||
mPagesErrorIcon.setImageResource(R.drawable.ic_info_error_generic);
|
||||
mPagesContent.setVisibility(View.GONE);
|
||||
} else if (!relationship.isSourceFollowingTarget()) {
|
||||
} else if (!relationship.isSourceFollowingTarget() && user.is_protected) {
|
||||
mPagesErrorContainer.setVisibility(View.VISIBLE);
|
||||
final String displayName = UserColorNameUtils.getDisplayName(getActivity(), user);
|
||||
mPagesErrorText.setText(getString(R.string.user_protected_summary, displayName));
|
||||
@ -684,12 +684,6 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
|
||||
super.onSharedElementEnd(sharedElementNames, sharedElements, sharedElementSnapshots);
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateSnapshotView(Context context, Parcelable snapshot) {
|
||||
final View view = super.onCreateSnapshotView(context, snapshot);
|
||||
return view;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSharedElementStart(List<String> sharedElementNames, List<View> sharedElements, List<View> sharedElementSnapshots) {
|
||||
final int idx = sharedElementNames.indexOf(TRANSITION_NAME_PROFILE_IMAGE);
|
||||
|
@ -60,17 +60,17 @@
|
||||
|
||||
<org.mariotaku.twidere.view.ActionIconView
|
||||
android:layout_width="wrap_content"
|
||||
android:id="@+id/empty_icon"
|
||||
android:layout_height="wrap_content"
|
||||
android:color="?android:textColorSecondary"
|
||||
android:src="@drawable/ic_info_tab"/>
|
||||
android:color="?android:textColorSecondary"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/empty_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:layout_marginTop="@dimen/element_spacing_normal"
|
||||
android:gravity="center"
|
||||
android:text="@string/no_tab"
|
||||
android:textAppearance="?android:textAppearanceMedium"/>
|
||||
</LinearLayout>
|
||||
</FrameLayout>
|
@ -3,5 +3,6 @@
|
||||
|
||||
<string name="default_tab_display_option">icon</string>
|
||||
<string name="profile_image_size">normal</string>
|
||||
<string name="default_profile_image_style">round</string>
|
||||
|
||||
</resources>
|
@ -701,12 +701,11 @@
|
||||
<string name="round">Round</string>
|
||||
<string name="square">Square</string>
|
||||
<string name="profile_image_style">Profile image style</string>
|
||||
<string name="default_profile_image_style">round</string>
|
||||
<string name="media_preview_style">Media preview style</string>
|
||||
<string name="draft_saved">Draft saved</string>
|
||||
<string name="open_twitter_links">Open Twitter links</string>
|
||||
<string name="N_others_quantity_one">another</string>
|
||||
<string name="N_others_quantity_other"><xliff:g id="retweet_count">%d</xliff:g> others</string>
|
||||
<string name="N_others_quantity_other"><xliff:g id="count">%d</xliff:g> others</string>
|
||||
<string name="type_name_to_search">Type name to search</string>
|
||||
<string name="no_user_found">No user found</string>
|
||||
<string name="members">Members</string>
|
||||
@ -733,5 +732,6 @@
|
||||
<string name="usage_statistics_header_summary">Twidere took part in some research project, join these projects will make Twidere and some other application better.</string>
|
||||
<string name="no_tab">No tab</string>
|
||||
<string name="user_protected_summary">You need to send follow request to this protected user to see tweets</string>
|
||||
<string name="no_account">No account</string>
|
||||
|
||||
</resources>
|
Loading…
x
Reference in New Issue
Block a user