Skip to content
This repository has been archived by the owner on Feb 12, 2024. It is now read-only.

Commit

Permalink
Shortcut support Android 7.X / Quota support added
Browse files Browse the repository at this point in the history
  • Loading branch information
DoM1niC committed Nov 26, 2016
1 parent c30d7c1 commit 8177a85
Show file tree
Hide file tree
Showing 28 changed files with 492 additions and 27 deletions.
10 changes: 5 additions & 5 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ dependencies {
compile project(':libs:audiowife')
compile files('libs/aspectjrt-1.7.3.jar')
compile files('libs/isoparser-1.0.6.jar')
compile 'com.android.support:support-v13:24.2.1'
compile 'com.android.support:support-v13:25.0.0'
compile 'org.bouncycastle:bcprov-jdk15on:1.52'
compile 'org.bouncycastle:bcmail-jdk15on:1.52'
compile 'org.gnu.inet:libidn:1.15'
Expand Down Expand Up @@ -76,13 +76,13 @@ android {
config {
}
}
compileSdkVersion 24
compileSdkVersion 25
buildToolsVersion "24.0.2"
defaultConfig {
minSdkVersion 14
targetSdkVersion 24
versionCode 1481
versionName "2.10"
targetSdkVersion 25
versionCode 1483
versionName "2.12"
archivesBaseName += "-$versionName"
applicationId "net.atomarea.flowx"
multiDexEnabled true
Expand Down
1 change: 1 addition & 0 deletions src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />

<uses-permission
android:name="android.permission.READ_PHONE_STATE"
Expand Down
55 changes: 54 additions & 1 deletion src/main/java/net/atomarea/flowx/services/AvatarService.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.net.Uri;
Expand Down Expand Up @@ -410,6 +412,57 @@ private boolean drawTile(Canvas canvas, Bitmap bm, int dstleft, int dsttop, int
return true;
}

public Bitmap getRoundedAvatar(final Contact contact, int size) {
final String KEY = key(contact, size) + "rounded";
Bitmap avatar = this.mXmppConnectionService.getBitmapCache().get(KEY);

if (avatar != null) {
return avatar;
}

avatar = getRoundedBitmap(get(contact, size), size);

this.mXmppConnectionService.getBitmapCache().put(KEY, avatar);

return avatar;
}

public Bitmap getRoundedBitmap(Bitmap bmp, int radius) {
return getRoundedBitmap(bmp, radius, "#FFFFFF");
}

public Bitmap getRoundedBitmap(Bitmap bmp, int radius, String background) {
Bitmap sbmp;

if (bmp.getWidth() != radius || bmp.getHeight() != radius) {
float smallest = Math.min(bmp.getWidth(), bmp.getHeight());
float factor = smallest / radius;
sbmp = Bitmap.createScaledBitmap(bmp,
(int) (bmp.getWidth() / factor),
(int) (bmp.getHeight() / factor), false);
} else {
sbmp = bmp;
}

Bitmap output = Bitmap.createBitmap(radius, radius, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);

final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, radius, radius);

paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(Color.parseColor(background));
canvas.drawCircle(radius / 2 + 0.7f, radius / 2 + 0.7f,
radius / 2 + 0.1f, paint);
paint.setXfermode(new PorterDuffXfermode(android.graphics.PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(sbmp, rect, rect, paint);

return output;
}

@Override
public void onAdvancedStreamFeaturesAvailable(Account account) {
XmppConnection.Features features = account.getXmppConnection().getFeatures();
Expand All @@ -420,4 +473,4 @@ public void onAdvancedStreamFeaturesAvailable(Account account) {
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,11 @@
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
import android.database.ContentObserver;
import android.graphics.Bitmap;
import android.graphics.drawable.Icon;
import android.media.AudioManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
Expand Down Expand Up @@ -66,7 +69,9 @@
import net.atomarea.flowx.parser.PresenceParser;
import net.atomarea.flowx.persistance.DatabaseBackend;
import net.atomarea.flowx.persistance.FileBackend;
import net.atomarea.flowx.ui.ConversationActivity;
import net.atomarea.flowx.ui.SettingsActivity;
import net.atomarea.flowx.ui.StartConversationActivity;
import net.atomarea.flowx.ui.UiCallback;
import net.atomarea.flowx.utils.ConversationsFileObserver;
import net.atomarea.flowx.utils.CryptoHelper;
Expand Down Expand Up @@ -376,6 +381,53 @@ public FileBackend getFileBackend() {
public AvatarService getAvatarService() {
return this.mAvatarService;
}
private void buildShortcuts() {
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.N_MR1) {
return;
}

ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);

Intent shortcutIntent = new Intent(getApplicationContext(), StartConversationActivity.class);
shortcutIntent.setAction(Intent.ACTION_MAIN);

ArrayList<ShortcutInfo> shortcuts = new ArrayList<>();

ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "idNew")
.setShortLabel(getString(R.string.action_add))
.setLongLabel(getString(R.string.action_add))
.setIcon(Icon.createWithResource(this, R.drawable.ic_shortcut_add_52dp))
.setIntent(shortcutIntent)
.build();

shortcuts.add(shortcut);

int i = 0;

for(Conversation c: getConversations()) {
Contact contact = c.getContact();
String name = contact.getDisplayName();

Intent intent = new Intent(getApplicationContext(), ConversationActivity.class);
intent.setAction(ConversationActivity.ACTION_VIEW_CONVERSATION);
intent.putExtra(ConversationActivity.CONVERSATION, c.getUuid());

ShortcutInfo.Builder builder = new ShortcutInfo.Builder(getApplicationContext(), c.getUuid())
.setShortLabel(name)
.setLongLabel(name)
.setIntent(intent);

Icon avatar = Icon.createWithBitmap(getAvatarService().getRoundedAvatar(contact, 100));
builder.setIcon(avatar);


shortcuts.add(builder.build());

if(i++ == 2) break;
}

shortcutManager.setDynamicShortcuts(shortcuts);
}

public void attachLocationToConversation(final Conversation conversation,
final Uri uri,
Expand Down Expand Up @@ -2901,6 +2953,7 @@ public void updateConversationUi() {
if (mOnConversationUpdate != null) {
mOnConversationUpdate.onConversationUpdate();
}
buildShortcuts();
}

public void updateAccountUi() {
Expand Down
82 changes: 70 additions & 12 deletions src/main/java/net/atomarea/flowx/ui/ConversationActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,14 @@
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
import android.media.ExifInterface;
import android.net.Uri;
import android.os.AsyncTask;
Expand Down Expand Up @@ -58,6 +61,7 @@
import net.atomarea.flowx.crypto.axolotl.FingerprintStatus;
import net.atomarea.flowx.entities.Account;
import net.atomarea.flowx.entities.Blockable;
import net.atomarea.flowx.entities.Contact;
import net.atomarea.flowx.entities.Conversation;
import net.atomarea.flowx.entities.Message;
import net.atomarea.flowx.entities.Transferable;
Expand Down Expand Up @@ -364,8 +368,9 @@ public String getTitle() {
mSlidingPaneLayout.setParallaxDistance(150);
mSlidingPaneLayout.setSliderFadeColor(0);
mSlidingPaneLayout.setPanelSlideListener(new PanelSlideListener() {

@Override
public void onPanelOpened(View v) {
public void onPanelOpened(View arg0) {
updateActionBarTitle();
invalidateOptionsMenu();
hideKeyboard();
Expand All @@ -377,16 +382,68 @@ public void onPanelOpened(View v) {
}

@Override
public void onPanelClosed(View v) {
public void onPanelClosed(View arg0) {
listView.discardUndo();
openConversation();
}

@Override
public void onPanelSlide(View v, float f) {
public void onPanelSlide(View arg0, float arg1) {
// TODO Auto-generated method stub

}
});
}

buildShortcuts();
}

private void buildShortcuts() {
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.N_MR1) {
return;
}

ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);

Intent shortcutIntent = new Intent(this, StartConversationActivity.class);
shortcutIntent.setAction(Intent.ACTION_MAIN);

ArrayList<ShortcutInfo> shortcuts = new ArrayList<>();

ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "idNew")
.setShortLabel(getString(R.string.action_add))
.setLongLabel(getString(R.string.action_add))
.setIcon(Icon.createWithResource(this, R.drawable.ic_shortcut_add_52dp))
.setIntent(shortcutIntent)
.build();

shortcuts.add(shortcut);

int i = 0;

for(Conversation c: conversationList) {
Contact contact = c.getContact();
String name = contact.getDisplayName();

Intent intent = new Intent(this, ConversationActivity.class);
intent.setAction(ACTION_VIEW_CONVERSATION);
intent.putExtra(CONVERSATION, c.getUuid());

ShortcutInfo.Builder builder = new ShortcutInfo.Builder(this, c.getUuid())
.setShortLabel(name)
.setLongLabel(name)
.setIntent(intent);

Icon avatar = Icon.createWithBitmap(avatarService().getRoundedBitmap(avatarService().get(c, 100), 100, "#FFFFFF"));
builder.setIcon(avatar);


shortcuts.add(builder.build());

if(i++ == 2) break;
}

shortcutManager.setDynamicShortcuts(shortcuts);
}

protected void AppUpdate() {
Expand Down Expand Up @@ -501,6 +558,7 @@ private void openConversation() {
sendReadMarkerIfNecessary(conversation);
}
listAdapter.notifyDataSetChanged();
buildShortcuts();
}

public void sendReadMarkerIfNecessary(final Conversation conversation) {
Expand Down Expand Up @@ -756,7 +814,9 @@ public void endConversation(Conversation conversation) {
}

public void endConversation(Conversation conversation, boolean showOverview, boolean reinit) {
if (showOverview) showConversationsOverview();
if (showOverview) {
showConversationsOverview();
}
xmppConnectionService.archiveConversation(conversation);
if (reinit) {
if (conversationList.size() > 0) {
Expand All @@ -765,18 +825,15 @@ public void endConversation(Conversation conversation, boolean showOverview, boo
} else {
setSelectedConversation(null);
if (mRedirected.compareAndSet(false, true)) {
Account pendingAccount = xmppConnectionService.getPendingAccount();
if (pendingAccount == null) {
Intent intent = new Intent(this, StartConversationActivity.class);
intent.putExtra("init", true);
startActivity(intent);
} else {
switchToAccount(pendingAccount, true);
}
Intent intent = new Intent(this, StartConversationActivity.class);
intent.putExtra("init", true);
startActivity(intent);
finish();
}
}
}

buildShortcuts();
}

@SuppressLint("InflateParams")
Expand Down Expand Up @@ -1701,6 +1758,7 @@ public void updateConversationList() {
else listView.discardUndo();
}
listAdapter.notifyDataSetChanged();
buildShortcuts();
}

public void runIntent(PendingIntent pi, int requestCode) {
Expand Down
29 changes: 29 additions & 0 deletions src/main/java/net/atomarea/flowx/ui/ConversationFragment.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import android.content.IntentSender;
import android.os.Bundle;
import android.os.Handler;
import android.text.Editable;
import android.text.InputType;
import android.text.Selection;
import android.text.Spannable;
Expand Down Expand Up @@ -561,6 +562,34 @@ public void onClick(View v) {
messagesView.setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL);
messageListAdapter = new MessageAdapter((ConversationActivity) getActivity(), this.messageList);

messageListAdapter.setOnQuoteListener(new MessageAdapter.OnQuoteListener() {

@Override
public void onQuote(String text) {
if (mEditMessage.isEnabled()) {
text = text.replaceAll("(\n *){2,}", "\n").replaceAll("(^|\n)", "$1> ").replaceAll("\n$", "");
Editable editable = mEditMessage.getEditableText();
int position = mEditMessage.getSelectionEnd();
if (position == -1) position = editable.length();
if (position > 0 && editable.charAt(position - 1) != '\n') {
editable.insert(position++, "\n");
}
editable.insert(position, text);
position += text.length();
editable.insert(position++, "\n");
if (position < editable.length() && editable.charAt(position) != '\n') {
editable.insert(position, "\n");
}
mEditMessage.setSelection(position);
mEditMessage.requestFocus();
InputMethodManager inputMethodManager = (InputMethodManager) getActivity()
.getSystemService(Context.INPUT_METHOD_SERVICE);
if (inputMethodManager != null) {
inputMethodManager.showSoftInput(mEditMessage, InputMethodManager.SHOW_IMPLICIT);
}
}
}
});
messagesView.setAdapter(messageListAdapter);

registerForContextMenu(messagesView);
Expand Down
Loading

0 comments on commit 8177a85

Please sign in to comment.